總結今天遇到的一個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