静态库与动态库的创建与使用 - Jackon Yang

标签: 静态库 动态库 jackon | 发表时间:2014-04-25 01:39 | 作者:Jackon Yang
出处:

1. 基本概念

  • 静态库:链接时,库与编译生成的 .o 文件一起打包到可执行文件中。 linux / windows 下扩展名分别为:.a / .lib
  • 动态库:链接时,不会打包到可执行文件中, 执行时会动态的加载动态库。 linux / windows 下扩展名分别为:.so / .dll

区别主要体现在:

  1. 可维护性。
    • 合入更新。合入动态库的更新,只要替换库即可。但合入静态则需要重新链接,生成新的可执行程序,全量更新。
    • 环境依赖。若包含静态库,编译成功后不依赖环境。动态库则存在依赖关系,需要环境中存在对应的动态库。
  2. 大小
    • 空间利用率。若依赖相同静态库,则存在多份拷贝。
    • 可执行文件大小。静态库文件较大。
  3. 动态库可以实现进程之间的资源共享,因此也称为共享库。

2. 静态库的创建与使用

静态库本质就是一组 .o 组成的压缩文件,扩展名为 .a / .lib

ar -crv libXXX.a mmmm.o nnnn.o

XXX 是库名,mmmm.o nnnn.o 是要打包的目标文件。crv 参数,含义分别是

  • c: do not warn if the library had to be created
  • r: replace existing or insert new file(s) into the archive
  • v: be verbose

使用时,只需在代码中引入 头文件,链接时,指定静态库的搜索路径(-L选项)和静态库名(不需要lib前缀和.a后缀,-l选项)。

 

g++ test.cpp -L../StaticLibrary -lXXX

 

3. 动态库

Window与Linux执行文件格式不同,在创建动态库的时候有一些差异。

  • Windows 下执行文件是 PE 格式,动态库需要一个 DllMain 函数做出初始化的入口,通常在导出函数的声明时需要有_declspec(dllexport) 关键字
  • Linux下 gcc 编译的执行文件默认是 ELF 格式, 不需要初始化入口,亦不需要函数做特别的声明,编写比较方便。

linux 下动态库的命名格式同静态库,为 libXXX.so 格式。

动态库的创建,使用编译器即可,不需要像静态库一样使用专门的打包工具。

若要创建动态库,源码编译时添加 - fPIC 选项,链接时添加   -shared 选项。

g++ -fPIC -shared -o libXXX.so xxx.cpp

 

用法同静态库,只是需要设置下搜索路径。默认搜索路径:/lib/,/usr/lib 

g++ test.cpp -L../DynamicLibrary -lXXX

设置搜索路径:

  1. 编辑 /etc/ld.so.conf,设置搜索路径
  2. 运行 ldconfig ,重建 /etc/ld.so.cache 文件。设置生效。

4. 相关工具

ldd 查看程序依赖的共享库(动态库)

gcc / g++ 参数 -I(大写 'i'),-L(大写'l'),-l(小写'L')

  •  -I(大写 'i') 头文件目录
  • -L(大写'l') 库目录
  • -l(小写'L') 库名

 大写是目录,小写是库。


本文链接: 静态库与动态库的创建与使用,转载请注明。

相关 [静态库 动态库 jackon] 推荐:

静态库与动态库的创建与使用 - Jackon Yang

- - 博客园_首页
静态库:链接时,库与编译生成的 .o 文件一起打包到可执行文件中. linux / windows 下扩展名分别为:.a / .lib. 动态库:链接时,不会打包到可执行文件中, 执行时会动态的加载动态库.  linux / windows 下扩展名分别为:.so / .dll. 合入动态库的更新,只要替换库即可.

gcc创建和使用动态库、静态库

- - CSDN博客综合推荐文章
本文以工程 libtest为例来说明用gcc创建和使用静态库、动态库的过程. libtest工程目录结构如下:. libtest/include/hello.h文件内容:. libtest/lib/hello.c文件内容:. libtest/src/main.c文件内容:. 1,进入libtest/lib目录,执行命令:.

技巧:Linux 动态库与静态库制作及使用详解

- mettli - IBM developerWorks 中国 : Linux : Articles,Tutorials
Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题; 2)在 Linux 静态库的制作过程中发现有别于 Windows 下静态库的制作方法;3)在 Linux 应用程序链接第三方库或者其他静态库的时候发现链接顺序的烦人问题.

浅析静态库链接原理

- - C++博客-首页原创精华区
静态库的链接基本上同链接目标文件 .obj/.o相同,但也有些不同的地方. 本文简要描述linux下静态库在链接过程中的一些细节. 静态库远远不同于动态库,不涉及到符号重定位之类的问题. 静态库本质上只是将一堆目标文件进行打包而已. 静态库没有标准,不同的linux下都会有些细微的差别. 大致的格式 wiki上描述的较清楚:.

与符号表分离程序或动态库, 如何用GDB调试

- - 搜索技术博客-淘宝
GDB支持用户将程序调试信息放在一个独立的文件里,而不是和可执行程序在一个文件中,GDB可以某种方式来查找和自动加载调试信息. 由于调试信息可能非常大,有时可能比可执行代码自身还要大,某些系统将其可执行程序的调试信息以单独的文件发布,在需要调试问题的时候,用户可以再安装这些文件. GDB支持两种设置单独调试信息文件的方式:.

JNA中内存处理-释放动态库中分配的内存(新)

- - CSDN博客推荐文章
前面已经介绍过一次JNA中内存释放方法,后经过实际分析,这样写的代码不是很优雅,实际项目中代码实现方法如下:. 如下是libvirt java binding实现代码存在内存泄露:. 如下是解决内存泄露的代码:. 作者:greencacti 发表于2012-11-16 21:56:05 原文链接.