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

相關文章
相關標籤/搜索