c++静态库动态库
1. 库的概念
库本质上是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
静态库:(.a, .lib) 在链接阶段,将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。可以简单看成是一组目标文件(.o/ .obj文件)的集合,很多目标文件经过压缩打包后形成的一个文件
动态库:(.so, .dll)
静态库和动态库指的是链接方式不同
2. 静态库
- 静态库对函数库的链接是放在编译时期完成的
- 程序运行时与函数库无关,移植方便
- 浪费空间和资源,因为所有的目标文件与牵涉到的函数库被链接合成一个可执行文件
2.1 静态库命名规则
命名规范:lib[your_library_name].a
lib: 前缀
your_library_name: 静态库名
.a: 扩展名
2.2 创建静态库(.a)
讲代码编译编译成目标文件 .o —> 通过ar工具将目标文件打包成为.a 静态库文件 (生成.a)
g++ -c StaticMath.cpp
// 需要带参数-c,否则直接编译为可执行文件
ar -crv libstaticmath.a StaticMath.o
2.3 使用静态库
需要在编译的时候,指定静态库的搜索路径(-L),指定静态库名(不需要lib[].a格式,-l选项)
-L: 指定要链接的库所在的目录
-l: 指定链接时需要的动态库,编译器查找动态库有命名规则,在名字前面加上lib,后面加上.a或.so来确定库的名称
g++ TestStaticLibrary.cpp -L../staticLibrary -lstaticmath
3. 动态库
静态库的特点:1.存在空间浪费;2.静态库对于程序的更新、部署和发布带来麻烦。
在这里插入图片描述
动态库在程序编译时不会被连接到目标代码中,在程序运行时候才被载入。
动态库在内存中只会拷贝一份,避免静态库存在浪费空间的问题。不同的应用程序调用相同的库,在内存里只需要一份该共享库的实例。
特点:
- 对库函数的链接载入推迟到程序运行的时期
- 进程之间可以实现资源共享
动态库不需要打包工具,直接使用编译器就可以创建动态库
3.1 动态库命名规则
名字形式为 libxxx.so
lib为前缀,.so为后缀
- 对于实际库文件,每个共享库都有特殊的名字"soname",在程序启动之后,通过名字告诉动态加载器应该载入哪个共享库
- 在文件系统中,soname是一个链接到实际动态库的链接,每个库都有一个另一个名字给编译器。他是一个指向实际库镜像文件的链接文件(lib+soname+.so)
3.2 创建动态库(.so)
生成目标文件 --> 生成动态库
g++ -fPIC -c DynamicMath.cpp
// -fPIC创建与地址无关的编译程序(pic, position independent code),使得能够在多个应用程序之间共享
g++ -shared -o libdynmath.so DynamicMath.o
// -shared指定生成动态链接库
也可以使用
g++ -fPIC -shared -o libdynmath.so DynamicMath.cpp
3.3 使用动态库
使用方式和静态库一样, -L, -l
当报错error while loading shared libraries…
如何定位共享库的位置?
当系统加载可执行代码的时候,能够知道所依赖的库名字,但是也需要知道绝对路径。需要动态载入器,对于elf(g++编译格式为此)格式的可执行程序,是由ld -linux.so*完成的,它会先后搜索elf文件DT_RPATH段环境变量LD_LIBRARY_PATH–/etc/ld/so.cache文件列表 —/lib/, /usr/lib 目录找到库文件后将其载入内存
- 如果安装在/lib, /usr/lib下,ld默认能够找到
- 如果安装在其他目录,需要添加至/etc/ld/so.cache文件中,步骤如下
- 编辑/etc/ld.so/conf,加入库文件所在目录的路径
- 运行ldconfig,(重建/etc/ld/so.cache文件)
4. 库相关命令
4.1 g++编译选项
-shared:指定生成动态链接库
-static:指定生成静态链接库
-fPIC:编译为独立位置的代码,用于编译共享库
-L: 表示连接的库所在的目录
-l: 指定连接时候需要的动态库
-Wall: 生成所有告警信息
-g: 编译器在编译的时候产生调试信息
-c: 把程序生成目标文件
4.2 nm命令
nm可以打印出库中涉及到的所有符号
nm libhello.h
4.2 ldd命令
可以查看一个可执行程序依赖的共享库
ldd libdynmath.so
参考教程:https://www.runoob.com/w3cnote/cpp-static-library-and-dynamic-library.html