总结今天遇到的一个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