
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2017-12-07 标题【转】动态库的链接和链接选项-L-rpath-link-rpath分类编程 / C C 标签CC·rpath【转】动态库的链接和链接选项-L-rpath-link-rpath链接动态库链接选项和路径本文转自【 https://my.oschina.net/shelllife/blog/115958 】有删改。链接动态库如何程序在连接时使用了共享库就必须在运行的时候能够找到共享库的位置。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的缺陷和使用准则可以参考《Why LD_LIBRARY_PATH is bad》 。通常情况下推荐还是使用gcc的-R或-rpath选项来在编译时就指定库的查找路径并且该库的路径信息保存在可执行文件中运行时它会直接到该路径查找库避免了使用LD_LIBRARY_PATH环境变量查找。链接选项和路径现代连接器在处理动态库时将链接时路径Link-time path和运行时路径Run-time path分开,用户可以通过-L指定连接时库的路径通过-R或-rpath指定程序运行时库的路径大大提高了库应用的灵活性。链接器ld的选项有 -L-rpath 和 -rpath-link看了下 man ld大致是这个意思-L: “链接”的时候去找的目录也就是所有的 -l 选项里的库都会先从 -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指定的路径会被记录在生成的可执行程序中用于运行时查找需要加载的动态库。