组成共享库的目标文件和一般目标文件有所不同,在编译时要加-fPIC选项(生成与位置无关代码 Position Independent code)。
$gcc -c -fPIC stack/stack.c stack/push.c stack/pop.c stack/is_empty.c
一般目标文件称为Relocatable(可重定位文件),在链接时可以把目标文件中各段的地址做重定位。
制作共享库:
$gcc -shared -o libstack.so stack.o push.o pop.o is_empty.o
共享库的搜索路径:
$gcc main.c -g -L. -lstack -Istack -o main
$./main
./main:error while loading shared libraries:libstack.so:cannot open shared object file:No such file or directory.
ldd查看可执行文件依赖于哪些共享库:
$ldd main
共享库的搜索路径由动态链接器决定,从ld.so(8) Man page可以查到共享库路径的搜索顺序:
1. 首先在环境变量LD_LIBRARY_PATH所记录的路径中查找。
2. 然后从缓存文件/etc/ld.so.cache中查找。这个缓存文件由ldconfig命令读取配置文件/etc/ld.so.conf之后生成。
3. 如果上述步骤都找不到,则到系统默认的路径中查找,/usr/lib,然后是/lib。
添加搜索路径方法:
1. $export LD_LIBRARY_PATH=. ./main
临时性,不推荐。
2. 把动态库绝对路径添加到/etc/ld.so.conf中(每个路径一行),然后运行ldconfig。(推荐)
ldconfig除了处理/etc/ld.so.conf中配置的目录之外,还处理一些默认目录,如/lib,/usr/lib等,
处理之后生成/etc/ld.so.cache缓存文件,动态链接器就从这个缓存中搜索共享库。
3. 把共享库拷贝到/usr/lib或/lib目录。
库链接顺序问题:
1. http://adam8157.info/blog/2010/09/libraries-link-order/
2. 链接时库的顺序问题
3. undefined reference to: xxx
4. 剖析共享程序库