静态库
创建
$ ar options archive object-file
常用选项:
- r(替换): 将一个目标文件插入到归档文件中并取代同名的目标文件
创建一个归档文件
$ cc -c mod1.c mod2.c mod3.c
$ ar r libdemo.a mod1.o mod2.o mod3.o
$ rm mod1.o mod2.o mod3.o
- t(目录表):显示归档中的目录表
t显示包含的目标文件,加上v显示目标文件的其他信息
$ ar t libdemo.a
$ ar tv libdemo.a
- d(删除):从归档中删除一个模块
$ ar d libdemo.a mod3.o
使用
- 在连接过程中指定静态库的名称
$ gcc -c main.c
$ gcc -o main main.o libdemo.a
- 将静态库放在链接器搜索的目录中(需要指定静态库的名称)
搜索标准目录
$ gcc -o main main.o -ldemo
搜索指定的额外目录
$ gcc -o main main.o -Lmylibdir -ldemo
$ ./main
动态库
创建
生成位置无关代码
$ gcc -fPIC -c mod1.c mod2.c mod3.c
创建共享库
$ gcc -shared -o libdemo.so mod1.o mod2.o mod3.o
查看是否是位置无关的(可选)
$ readelf -d libdemo.so | grep TEXTREL
使用

简单来说就是
- 注册动态库,提供链接所需的外部符号
注册动态库
$ gcc -o main main.c libdemo.so
或者如下(与静态库相同)
$ gcc -o main main.c -Lmylibdir -ldemo
- 运行时加载动态库
动态链接
$ LD_LIBRARY_PATH=. ./main
$ gcc -o main main.c -Lmylibdir -ldemo -Wl,-rpath=mylibdir
动态库搜索流程
- 显式路径:如果路径中包含斜线,使用该路径(比如
./libfoo.so而不是libfoo.so) DT_RPATH:检查可执行文件中的DT_RPATHLD_LIBRARY_PATH:检查环境变量LD_LIBRARY_PATHDT_RUNPATH:检查可执行文件中的DT_RUNPATH/etc/ld.so.cache:检查缓存文件- 默认路径:如果没有找到,搜索
/lib和/usr/lib目录
posted on
浙公网安备 33010602011771号