链接详解--共享库

组成共享库的目标文件和一般目标文件有所不同,在编译时要加-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. 剖析共享程序库

原文地址:https://www.cnblogs.com/embedded-linux/p/4878740.html