一、动态链接库
1、概念
描述:链接时不会把代码编译到二进制文件中,而是在运行时才去加载,所以只需要维护一个地址。
动态:运行时需要时才加载,动态加载。
链接:库文件和.o目标文件分离,用特殊的手段维护两者关系。
库:库文件。
2、文件后缀格式
Windows 下
libxxx.dll
Linux 下
libxxx.so
3、命名方式:
xxx.cpp -> libxxx.so
前面必须是 lib 开头, 必须这样命名,否则无法使用.
4、生成和使用动态库
生成和链接动态库时经常用到的gcc选项
生成动态库
g++ -shared -fPIC func1.cpp -o libfunc1.so
接入动态库
g++ -L./ -lfunc1 main.cpp -o main
运行程序,
./main
此时运行程序会报错: 找不到库
解决办法:
先ldd 程序名
查看缺少哪个库
解决方法1: 把缺少的库放到系统共享库文件夹
usr/lib 或 usr/local/lib
解决方法2: 引入库的路径(临时引用, 此方法只对本次shell有效)
export LD_LIBRARY_PATH=缺失库的路径
运行程序
./main
运行成功
二、静态库
1、概念
基本概念:会把库中的代码编译到二进制文件中,当程序编译完成后,库文件可以删除。
2、文件后缀格式
Windows 下
libxxx.lib
Linux 下
libxxx.a
3、命名方式:
xxx.cpp -> libxxx.a
前面必须是 lib 开头, 必须这样命名,否则无法使用.
4、生成和使用静态库
正常编译生成可重定向的目标文件
xxx.o
g++ -c xxx.cpp -o xxx.o
使用
ar
工具打包为静态库
ar -rc xxx.o -o libxxx.a
ar
工具常用选项
编译时链接静态库
g++ -L./ -lxxx main.cpp -o main
运行程序
./main
运行成功