首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

静态库和动态库制作

前言 我们在编写代码的时候经常用到已有的接口,他们是以库的形式提供给我们使用的,而常见形式有两种,一种常以 .a 为后缀,为静态库;另一种以 .so 为后缀,为动态库。...所谓的静态、动态指的是链接的过程。 ---- 一、静态库和动态库介绍 1、静态库 程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库。...2、动态库 程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。.../test 出错原因分析: 连接器: 工作于链接阶段,工作时需要 -l 和 -L 动态链接器: 工作于程序运行阶段,工作时需要提供动态库所在目录位置 解决办法:指定动态库路径并使其生效,然后再执行文件.../test 四、对比 1、静态库优缺点 静态库的加载速度快 发布程序无需提供静态库,移植方便 消耗系统资源,浪费内存 更新、部署和发布麻烦 2、动态库优缺点 可以实现进程间的资源共享 更新、部署、发布简单

24820
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    cmake链接静态库-static-libstdc++问题

    在嵌入式平台中,业务使用C语言开发,在交叉编译过程中会链接一个第三方的c++静态库,该第三放库使用了std,需要链接libstdc++的库,由于所在的嵌入式平台中没有libstdc++.so库,如果将libstdc...++.so拷贝板子上,需要占用5MB空间,很浪费空间,准备使用libstdc++的静态库,在链接过程中出现如下问题;   整个业务的编译使用cmake构建,使用如下方式进行链接; add_executable...'libstdc++'的库,在cmake中有链接-static-libstdc++,而且交叉工具链中是有libstdc++.a库,当我们将cmake改为: add_executable(${target...} ${src_sample}) target_link_libraries(${target}  -lstdc++) 可以编译成功,但此时链接的是stdc++动态库,与预期相违背; 经过漫长的资料查阅终于找到原因...'lstdc++'是gcc和g++都能识别,但是'-static-libstdc++'只有g++可以识别,而我的业务代码都是使用C语言编写的,在链接时cmake默认使用的是gcc,但是gcc不能识别'-

    7.2K51

    C语言 | 什么是静态链接库和动态链接库?

    今天分享的是静态链接库和动态链接库的相关知识,并且自己动手写一个简单的静态函数库和动态函数库,来体验这个流程。 首先要从函数库的发明开始说起。...这时候的解决方案就是以库(主要有2种:静态库和动态库)的形式来提供。 比较早出现的是静态链接库。...商业公司通过发布.a库文件和.h头文件来提供静态库给客户使用。动态链接库比静态链接库出现的晚一些,效率更高一些,是改进型的。现在我们一般都是使用动态库。...这个.a文件就是静态库文件,lib后面的是库文件名称。制作出来了静态库之后,发布时只需要发布.a文件和.h文件。以上就是静态链接库的制作过程。...以上就是今天的内容,主要是介绍了函数库的来源和背景知识,以及静态链接库和动态链接库的制作及使用方法。

    4.7K40

    在linux下制作静态库和动态链接库的方法

    它是多个.o文件的集合。Linux中静态库文件的后缀为"a"。 静态库的代码在编译时就已经链接到应用程序中 静态库中的各个成员(.o文件)没有特殊的存在格式,仅仅是一个.o文件的集合。...使用"ar"工具维护和管理静态库 ar的三个参数中:r代表将文件插入归档文件中,c代表建立归档文件,s代表若归档文件中包含了对象模式,可利用此参数建立备存文件的符号表。...lib和.a都是系统指定的静态库文件的固定格式,mylib才是静态库的名称, 编译时,链接器会在标准路径(/usr/lib;/lib)或者用户指定的路径下去找.a的文件。...–lmylib -static指定编译器链接静态库,-L.指定静态库的路径为当前路径, 在gcc编译器中引用可搜索到的目录和库文件时需用(-l+库名), 如在gcc中加入-lm可以在程序汇中链接标准算术库...–lmylib,连接器会为我们链接指定的静态库以及标准C的共享库。

    3.2K20

    静态库和动态库的使用

    库是一种可执行的二进制文件,是编译好的代码。使用库可以提高开发效率。在 Linux 下有静态库和动态库。 静态库在程序编译的时候会被链接到目标代码里面。所以程序在运行的时候不再需要静态库了。...因此编译出来的体积就比较大。以 lib 开头,以.a 结尾。 动态库(动态库也叫共享库)在程序编译的时候不会被链接到目标代码里面,而是在程序运行的时候被载入的。所以程序在运行的时候需要动态库了。...静态库的制作步骤: 编写或准备库的源代码 将源码.c 文件编译生成.o 文件 使用 ar 命令创建静态库 测试库文件 动态库制作步骤: 编写或准备库的源代码 将源码.c 文件编译生成.o 文件 使用 gcc...命令创建动态库 测试库文件 静态库 新建 mylib.c 文件: #include void mylib(void); void mylib(void) { printf("...-L:指定动态库的查找位置。

    1K20

    静态链接库和动态链接库的区别

    1、链接库概述Linux下得库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。...动态链接库的加载方式有两种:隐式加载和显示加载。注意:linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接(见本文第四部分)。...2、静态链接库下面就通过实际的例子来向大家演示一下,该怎样编译和使用静态和动态链接库:2.1、编辑测试文件二个文件:add.c、 sub.c、add.h 、sub.h 和 main.c/*add.h *...在使用时应包含的头文件Winbase.h(include Windows.h)dlfcn.h5、特殊情况我们回过头看看,发现使用静态库和隐式方式使用动态库时编译成目标程序使用的gcc命令完全一样,那当静态库和动态库同名时.../main运行的结果中很容易知道,当Linux静态库和Linux动态库同名时, gcc命令将优先使用动态库。

    8.5K21

    静态库和动态库的区别

    什么是库? 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。 所谓静态、动态是指链接。...2、程序在运行时与函数库再无瓜葛,移植方便。 3、浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。...通过上面的介绍发现静态库,容易使用和理解,也达到了代码复用的目的,那为什么还需要动态库呢? 为什么还需要动态库? 为什么需要动态库,其实也是静态库的特点导致。 1、空间浪费是静态库的一个问题。 ?...2、另一个问题是静态库对程序的更新、部署和发布页会带来麻烦。...动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。 ? 动态库特点总结: 1、动态库把对一些库函数的链接载入推迟到程序运行的时期。

    2K90

    cmake 添加头文件目录,链接动态、静态库

    cmake 添加头文件目录,链接动态、静态库 cmake 添加头文件目录,链接动态、静态库 1. 添加头文件目录INCLUDE_DIRECTORIES 2....env目录,而不是常见的/usr/、/usr/local等目录,使用cmake进行编译时需要注意头文件和库文件的目录的设置。...cmake 添加头文件目录,链接动态、静态库 罗列一下cmake常用的命令。 CMake支持大写、小写、混合大小写的命令。 1....(myProject libcomm.a) # 显示指定链接静态库 target_link_libraries(myProject libcomm.so) # 显示指定链接动态库 # 再如: target_link_libraries...,链接动态、静态库 cmake 链接动态链接库 cmake 3.19官网帮助文档 Getting started with cmake CMake projects in Visual Studio Configure

    25.8K11

    【Linux】静态库和动态库

    一、动态库和静态库 具体的动态库和静态库的相关内容点击跳转 Linux的库一般分为动态库和静态库: 静态库(.a):库文件以.a为后缀,程序在编译链接的时候把库的代码链接到可执行文件中。...程序运行的时候将不再需要静态库 动态库(.so):库文件以.so为后缀,程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。...链接的本质:无非就是我们调用库函数的时候和标准库是如何关联的问题 库的名称:去掉前缀lib去掉后缀.so/.a剩下的就是库名称,比如libc.so就是C库 gcc 在编译时默认使用动态链接,而生成静态链接...上面说了那么多,总结一下: -I:指明头文件的搜索路径 -L:指明库文件的搜索路径 -l:指明要链接哪个库,带上库的名称(去掉前缀和后缀) gcc默认是动态链接的(建议行为)对于特定的一个库,...而静态库可能有多个程序用了C库,加载到内存时,内存里可能会存在100份重复的代码。而动态链接不会出现重复的代码,减少内存。

    34630

    【Linux】静态库和动态库

    动静态库 一、静态库 1. 静态库概念 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。 2....制作静态库 (1)朴素方法 — 不打包 下面我们实现两个简单的方法,加法和减法的计算方法,使用头文件和源文件分开的形式呈现出来,例如: 那么这一堆头文件和源文件该如何形成一个静态库给别人使用呢?...gcc 默认是动态链接的,但个别库,如果我们只提供 .a,gcc 也会局部性的把我们指定的 .a 进行静态链接,其它库正常动态链接,如果加上 -static 选项,gcc 就只能链接 .a。...如果我们将头文件和库文件都安装到系统中了,-I 和 -L 就不需要带了。 二、动态库 1. 动态库概念 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。 2....而静态库是直接拷贝到可执行程序中的,所以它们会被一起加载到内存中。也就是说,动态链接非常依赖这个动态库!

    77810

    【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )

    CMake 简介 II . Android Studio 中 CMake 引入静态库流程 III . 指定 CMake 最小版本号 IV . 导入函数库 ( 静态库 / 动态库 ) 编译配置 V ....CMake 构建脚本 CMakeList.txt 链接静态库 : # 链接函数库 # 参数 1 : 本构建脚本要生成的动态库目 标 # 参数 2 ~ ... : 后面是之前预编译的动态库或静态库...导入函数库 ( 静态库 / 动态库 ) 编译配置 ---- 函数库 ( 静态库 / 动态库 ) 编译配置 : 函数库编译需要传入 3 个参数 ; ① 参数 1 : 设置生成的动态库名称 ; ② 参数 2...链接函数库 ---- 链接函数库 : 这里注意第一个参数必须是要生成的动态库模块 ; # 链接函数库 # 参数 1 : 本构建脚本要生成的动态库目标 # 参数 2 ~ ... :.../jniLibs/armeabi-v7a") # 链接函数库 # 参数 1 : 本构建脚本要生成的动态库目 标 # 参数 2 ~ ... : 后面是之前预编译的动态库或静态库

    2.9K40

    静态库和动态库的区别

    问题 静态库和动态库有什么区别? 回答 后缀名不同 动态库的后缀,在 Windows 上是 .dll,linux 上是 .so,在 OSX 上是 .dylib。...可执行文件大小不一样 静态链接的可执行文件要比动态链接的可执行文件要大得多,因为它将需要用到的代码从二进制文件中“拷贝”了一份,而动态库仅仅是复制了一些重定位和符号表信息。...扩展性与兼容性不一样 如果静态库中某个函数的实现变了,那么可执行文件必须重新编译,而对于动态链接生成的可执行文件,只需要更新动态库本身即可,不需要重新编译可执行文件。...正因如此,使用动态库的程序方便升级和部署。 依赖不一样 静态链接的可执行文件不需要依赖其他的内容即可运行,而动态链接的可执行文件必须依赖动态库的存在。...加载速度不一样 由于静态库在链接时就和可执行文件在一块了,而动态库在加载或者运行时才链接,因此,对于同样的程序,静态链接的要比动态链接加载更快。所以选择静态库还是动态库是空间和时间的考量。

    1.7K20

    CMake 静态库与动态库构建

    在前面一篇文章写了如何使用CMake编译“hello world”。这一篇写写构建静态库和动态库。...上一文章链接:《CMake,大型项目采用的构建工具》 对于静态库和动态库的了解,可以看看之前的文章: 静态库:《静态链接库的实现》 动态库:《动态链接库的实现》 在上一篇文章中,我们说了内部构建和外部构建的区别...$ cd lib $ ls CMakeFiles cmake_install.cmake librice.a Makefile $ 编译完,在lib目录下生成了librice.a这个静态库。...STATIC,静态库 MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。...EXCLUDE_FROM_ALL,参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。 根据ADD_LIBRARY指令的描述,在上面的例子中,很清楚的理解是生成静态库的操作。

    1.8K20

    cmake:动态链接库(so)中静态链接tcmalloc(gperftools2.4)暨静态链接libstdc++

    tcmalloc.a也可以以静态链接的方式加入应用程序中,大概因为使用太方便,网上关于这方面的介绍都是一笔带过,但是如果要在动态 库(so)中静态编译tcmalloc,却是有所不同的。...于是我觉得用静态链接方式将tcmalloc编译到so库中比较好,这样这个动态库以比较独立的方式发行,不再依赖系统中是否安装了tcmalloc和libunwind。...下面是我的CMakeLists.txt中关于静态连接tcmalloc和libstdc++的代码。...(so的代码是以C++11写的,所以还要依赖于libstdc++库,所以我打算把libstdc++库也以静态方式连接到程序中) ##判断操作系统类型 if(CMAKE_SYSTEM_NAME MATCHES...总结 如果在可执行程序中静态链接tcmalloc时,用默认参数编译tcmalloc就好了,无需带-fPIC参数, 但是在动态库(so)中静态链接tcmalloc,必须要用-fPIC重新编译tcmalloc

    2.1K10

    Eclipse C++配置静态链接库和动态链接库

    2、编写代码在windows下封装动态链接库时对要封的函数要用__declspec(dllexport)来标明,在linux下不用,在linux下只需要直接把要封的函数的声明放到一个。...h文件中,要用这个库时将相应的。h文件加载到工程中。   3、生成动态链接库编译代码,成功后在Debug目录下会生成liba.so文件。   ...3、加入动态链接库liba.so右键工程Properites->C/C++ Build->Settings,然后如下图   注意最右边,库的名称liba.so变为a,库的路径就写这个库所在的路径。...以上就完成了linux下生成动态链接库和使用动态链接库。...因为要静态链接到正则表达式的库,所以如下图所示,设置对应的*.a文件路径到eclipse,以使链接器能够找到它。

    3.5K10
    领券