C++动态库、静态库
- 命名
- 静态库制作
- 静态库的使用
- 静态库的优缺点
- 动态库的制作
- 动态库的使用
- 动态库优缺点
常说C++静态库是程序链接阶段直接把库文件复制到程序中,动态库是在链接阶段没有被复制到程序中,而是在程序运行的时候由系统动态加载到内存中供程序调用。但是这么说,还是有点不明白,这是因为对库文件的本质不了解。
有这么一种定义:库文件是计算机上的一种文件,可以简单地把库文件定义成一个代码仓库,他提供给使用者一些已经定义好的变量、函数、类。这,不就是相当于python的库吗???相当于要使用别人的代码的时候,就pip install想要的代码。C++中的库也是酱紫,要用别人的,就引入。自己的代码也可以打包成库,包括动态库和静态库,在后续的开发中,自己可以用,别人也能用!!!
C++使用库有两个好处:
- 代码保密
- 方便部署和分发
命名
windows下:
libxxx.lib — 静态库
libxxx.dll — 动态库
linux下:
libxxx.a — 静态库
libxxx.so — 动态库
静态库制作
ar rcs libxxx.a xxx.o xxx.o
使用ar指令进行打包,rcs是参数,r代表将文件插入备存文件当中,c表示建立备存索引,s表示索引,libxxx.a表示使用后面的二进制.o文件生成一个名为libxxx.a的静态库。
静态库的使用
生成好了一个静态库文件.a,别人要使用你的库文件时,你也需要把相应的头文件提供给别人,要不然别人怎么知道你的库里面是什么东西呢?
当main.cpp要使用libxxx.a时,该这么编译:
gcc main.cpp -o app -I ./include/ -l xxx -L ./lib/
解释:main.pp使用到了libxxx库,-o指定生成app为可执行二进制文件,-I指定include路径,-l指定使用的库文件,这个文件名不需要lib前缀,-L指定库文件所在的目录。
静态库的优缺点
优点
- 静态库被打包到应用程序中加载速度快
- 发布程序无需提供静态库,移植方便
缺点
- 消耗系统资源,浪费内存
- 更新、部署、发布麻烦
动态库的制作
# -fpic生成和位置无关的文件
gcc -c -fpic/-fPIC x.c
# -shared生成x.o的动态库
gcc -shared x.o -o libx.so
动态库的使用
和静态库的使用相同:
gcc main.cpp -o app -I ./include/ -l xxx -L ./lib/
但是会出现找不到动态库的问题。因为动态库是在程序运行时,用到一个库的函数的时候再去库中找,所以需要知道库的位置在哪里。动态库的查找顺序一般如下:DT_RPATH段—》环境变量LD_LIBRARY_PATH—〉/etc/ld.so.cache文件列表—》lib, /urs/lib目录。如果都找不到,那么就报错。如果想要解决找不到动态库的问题,那么就在这些查找路径中加入相应的路径。
ldd(list dynamic dependencies)指令能查看可执行文件的动态库依赖。
动态库优缺点
优点
- 可以实现进程间资源共享
- 更新、发布、部署简单
- 可以控制何时加载动态库
缺点
- 加载速度比静态库慢
- 发布程序时,需要提供依赖的动态库