so庫鏈接和運行時選擇哪個路徑下的庫?


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM