总结今天遇到的一个so库链接、运行问题。

    这几天修改了xapian的源码,重新编译so库,再重新编译之前的demo程序,跑起来后却发现执行的函数并非我修改过的,使用的还是老版本。折腾了一会儿,发现是因为/usr/local/lib目录中含有同名so库导致。这里记录下正确的解决思路。

1 确保链接到了正确的so库

    gcc可以通过-L指定链接时所依赖库的搜索路径,譬如:g++ -std=c++0x -L/data/home/cswuyg/xapian_proj/xapian-core-1.2.25-install/lib -o hello_world hello_world.o  -lxapian。那么,如果系统路径中跟-L路径中有同名库,哪个更优先呢?优先级如下:

(1)-L指定的目录;

(2)环境变量LIBRARY_PATH指定的目录;

(3)/lib /usr/lib usr/local/lib 目录;

    也就是说-L指定的目录是优先使用的,即便系统目录中含有同名so库,也没有关系。可以在编译命令中加上--verbose查看链接详情信息,会列出来collect2所使用的所有-L目录。对编译链接出来的ELF文件,可以采用ldd工具查看依赖的so情况

2 确保运行时使用了正确的so库

    链接和运行所搜索的so库路径是分开的,可以通过在链接时通过-Wl-rpath=xx强制指定从某个地方读取,譬如强制在同目录下读取:g++ -std=c++0x -L/data/home/cswuyg/xapian_proj/xapian-core-1.2.25-install/lib  -Wl,-rpath=. -o hello_world hello_world.o  -lxapian 。

    之前我遇到的问题就是因为没有使用-Wl,-rpath,导致运行时使用的so是系统目录下的同名so。

     链接和运行时的so路径资料可以参考这里:https://www.cnblogs.com/youxin/p/5357614.html

posted on 2019-03-23 00:25  烛秋  阅读(2130)  评论(0编辑  收藏  举报