华佗养生网
您的当前位置:首页动态库的链接和链接选项-L,-rpath-link,-rpath

动态库的链接和链接选项-L,-rpath-link,-rpath

来源:华佗养生网
动态库的链接和链接选项-L,-rpath-link,-rpath

链接动态库

如何程序在连接时使⽤了共享库,就必须在运⾏的时候能够找到共享库的位置。linux的可执⾏程序在执⾏的时候默认是先搜索/lib和/usr/lib这两个⽬录,然后按

照/etc/ld.so.conf⾥⾯的配置搜索绝对路径。同时,Linux也提供了环境变量LD_LIBRARY_PATH供⽤户选择使⽤,⽤户可以通过设定它来查找除默认路径之外的其他路径,如查找/work/lib路径,你可以在/etc/rc.d/rc.local或其他系统启动后即可执⾏到的脚本添加如下语句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路径优先于系统默认路径之前查找(详细参考《使⽤LD_LIBRARY_PATH》)。

不过LD_LIBRARY_PATH的设定作⽤是全局的,过多的使⽤可能会影响到其他应⽤程序的运⾏,所以多⽤在调试。(LD_LIBRARY_PATH的缺陷和使⽤准则,可以参考《Why LD_LIBRARY_PATH is bad》 )。通常情况下推荐还是使⽤gcc的-R或-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执⾏⽂件中,运⾏时它会直接到该路径查找库,避免了使⽤LD_LIBRARY_PATH环境变量查找。

链接选项和路径

现代连接器在处理动态库时将链接时路径(Link-time path)和运⾏时路径(Run-time path)分开,⽤户可以通过-L指定连接时库的路径,通过-R(或-rpath)指定程序运⾏时库的路径,⼤⼤提⾼了库应⽤的灵活性。⽐如我们做嵌⼊式移植时#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下是交叉编译好的zlib库),将target编译好后我们只要把zlib库拷贝到开发板的系统默认路径下即可。或者通过-rpath(或-R )、LD_LIBRARY_PATH指定查找路径。链接器ld的选项有 -L,-rpath 和 -rpath-link,看了下 man ld,⼤致是这个意思:

-L: “链接”的时候,去找的⽬录,也就是所有的 -lFOO 选项⾥的库,都会先从 -L 指定的⽬录去找,然后是默认的地⽅。编译时的-L选项并不影响环境变量

LD_LIBRARY_PATH,-L只是指定了程序编译连接时库的路径,并不影响程序执⾏时库的路径,系统还是会到默认路径下查找该程序所需要的库,如果找不到,还是会报错,类似cannot open shared object file。

-rpath-link:这个也是⽤于“链接”的时候的,例如你显⽰指定的需要 FOO.so,但是 FOO.so 本⾝是需要 BAR.so 的,后者你并没有指定,⽽是 FOO.so 引⽤到它,这个时候,会先从 -rpath-link 给的路径⾥找。

-rpath: “运⾏”的时候,去找的⽬录。运⾏的时候,要找 .so ⽂件,会从这个选项⾥指定的地⽅去找。对于交叉编译,交叉编译链接器需已经配置 –with-sysroot 选项才能起作⽤。也就是说,-rpath指定的路径会被记录在⽣成的可执⾏程序中,⽤于运⾏时查找需要加载的动态库。-rpath-link 则只⽤于链接时查找。

链接搜索顺序

直接man ld。The linker uses the following search paths to locate required shared libraries:

gcc和链接选项的使⽤

在gcc中使⽤ld链接选项时,需要在选项前⾯加上前缀-Wl(是字母l,不是1),以区别不是编译器的选项。

if the linker is being invoked indirectly, via a compiler driver (e.g. gcc) then all the linker command line options should be prefixed by -Wl, (or whatever is appropriate forthe particular compiler driver) like this:gcc main.c -lhello -L . -Wl.-rpath=./lib

This is important, because otherwise the compiler driver program may silently drop the linker options, resulting in a bad link.

因篇幅问题不能全部显示,请点此查看更多更全内容