静态库

创建

$ 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

使用

1

简单来说就是

  • 注册动态库,提供链接所需的外部符号
注册动态库
$ 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

动态库搜索流程

  1. 显式路径:如果路径中包含斜线,使用该路径(比如./libfoo.so 而不是libfoo.so)
  2. DT_RPATH:检查可执行文件中的 DT_RPATH
  3. LD_LIBRARY_PATH:检查环境变量 LD_LIBRARY_PATH
  4. DT_RUNPATH:检查可执行文件中的 DT_RUNPATH
  5. /etc/ld.so.cache:检查缓存文件
  6. 默认路径:如果没有找到,搜索 /lib/usr/lib 目录
 posted on 2025-06-05 17:25  Dylaris  阅读(12)  评论(0)    收藏  举报