so库连接和运行时选择哪一个路径下的库?

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

    这几天修改了xapian的源码,从新编译so库,再从新编译以前的demo程序,跑起来后却发现执行的函数并不是我修改过的,使用的仍是老版本。折腾了一下子,发现是由于/usr/local/lib目录中含有同名so库致使。这里记录下正确的解决思路。c++

1 确保连接到了正确的so库api

    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指定的目录;spa

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

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

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

相关文章
相关标签/搜索