公众号:CppCoding
库分为两种:一种是静态库(.a和.lib) 和动态库(.so和.dll)。
所谓静态,动态是指链接
静态库
其在链接阶段,会将生成的目标文件.o与引用到的库一起链接打包到可执行文件中,因此对应的链接方式是静态链接
静态库特点总结:
1.静态库对函数库的链接是放在编译时期完成的
2.程序在运行时与函数库再无瓜葛,移植方便
3.浪费空间和资源,因为所有相关的目标文件与牵扯到的函数库被链接合成一个可执行文件
Linux静态库命名规则
必须是 ** lib[your_library_name].a **,lib是前缀,中间是静态库名,扩展名为.a
- 创建静态库(.a)
首先将代码文件编译成目标文件.o
g++ -c math.cpp
然后通过ar工具将目标文件打包成.a静态库文件
ar -crv libmath.a math.o
生成静态库 libmath.a
- 使用静态库
Linux下使用静态库,只需要在编译的时候指定静态库的搜索路径(-L),指定静态库名(不需要lib前缀.a后缀,-l)
g++ test.cpp -L. -lmath
共享库
弥补静态库的缺点
1.空间浪费是静态库的一个问题
2.另一个问题是静态库对程序的更新,部署和发布会带来麻烦。如果静态库更新了,使用它的程序都需要重新编译,发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)
动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。不同的应用程序如果调用相同的库,那么在内存里面只需要有一份该共享库的示例,规避了空间浪费问题。
动态库特点总结:
1.动态库把对一些库函数的链接载入推迟到程序运行时期
2.可以实现进程之间的资源共享
3.将一些程序升级变得简单
Linux下创建与使用动态库
Linux的动态库的命名规则
动态链接库的名字形式为 ** libxxx.so** ,前缀是lib,后缀是.so
1.针对于实际库文件,每个共享库都有个特殊的名字 soname。在程序启动后,程序通过这个名字来告诉动态加载器该载入那个共享库
2.在文件系统中,soname仅是一个链接到实际动态库的链接。
创建动态库
1.生成目标文件
g++ -fPIC -c math.cpp
-fPIC是创建与地址无关的编译程序,(position independent code),是为了能够在多个应用程序间共享
2.生成动态库
g++ -shared -o libmath.so math.o
-shared是指定生成动态链接库
上面两个步骤合为一个命令
g++ -fPIC -shared -o libmath.so math.cpp
使用动态链接库
g++ test.cpp -L. -lmath
通过 ln -s 加realname ,可以生成linkname
通过Wl可以生成soname
此时运行可能会报错,需要把动态库加载到指定位置
如何让系统找到动态库:
1.如果安装在/lib或者/usr/lib下,那么ld默认能够找到(也可以直接将库复制到这两个目录下)
2.如果安装在其他目录下,需要将其添加到/etc/ld.so.cache文件中,步骤如下
- 编辑/etc/ld.so.conf文件,加入库文件所在目录的路径
- 运行ldconfig,该命令会重建/etc/ld.so.cache文件
更多详细内容:
https://blog.csdn.net/dd_hello/article/details/81782934