库是已经写好的,成熟的,可复用的代码。库可以看作一组目标文件的集合,将这些目标文件经过压缩打包之后形成的文件。
静态库
在程序的链接阶段被复制到程序中。
制作步骤
- 编译为目标文件(.o)
- 把相关的.o文件打包:ar rcs libname.a file.o…
- 将头文件和库一起发布
缺点:执行程序时体积较大。库变更的时候需要重新编译应用
动态库
在程序运行时加载。
制作步骤
- 编译与位置无关的目标文件,加参数 -fPIC
- 把相关的.o文件打包 g++ -shared -o libname *.o
- 将头文件和库一起发布
解决不能加载自定义动态库的问题
- 将库路径增加到环境变量LD_LIBRARY_PATH中
- 配置/etc/ld.so.conf文件,增加自定义库文件夹所在路径,执行sudo ldconfig -v
优点:如果输出接口不变,库变更的时候不需要重新编译应用
缺点:执行时需要加载动态库,相比而言,比静态库慢。发布应用时需要同时发布动态库。
链接
静态链接:找到静态库,拷贝静态库中所需要的代码到可执行程序中。
动态链接:找到动态库,拷贝动态库中所需要的代码的地址到可执行程序相关的位置