gcc -L、-Wl,-rpath, -Wl,-rpath-link的區別


現要在目錄 mainDir 下編譯庫libmain.so, 但是其 ---依賴於---> libsub.so,sub.so在目錄 mainDir / subDir 下,且subDir不在LD_LIBRARY_PATH以及環境變量中。

現有如下執行:

  1. gcc -share -o libmain.so  main.o

    此命令可編譯並鏈接通過,利用ldd libmain.so時沒有發現有對libsub.so的依賴,但是ldd -r libmain.so時會發現會有sub庫中的函數出現undefined symbol。

    因為libmain.so 依賴於 libsub.o,但是鏈接時沒有添加lsub。

  2.gcc -share -lsub -o libmain.so  main.o

    此命令無法通過編譯,會提示/usr/bin/ld: cannot find -lsub。

    因為libsub.so在目錄subDir下,而subDir不在LD_LIBRARY_PATH和環境變量中。所以在鏈接時,gcc無法找到libsub.so。

  3.gcc -share -L./subDir -lsub -o libmain.so  main.o

    此命令可編譯並鏈接通過,但是ldd -r libmain.so時會發現 libsub.so => not found。因為 libsub.o在目錄subDir下。

  4.gcc -share -Wl,-rpath-link='./subDir'  -L./subDir -lsub -o libmain.so  main.o

    此命令可編譯並鏈接通過,但是在ldd -r libmain.so時還是會發現 libsub.so => not found。

  5.gcc -share -Wl,-rpath='./subDir'  -L./subDir -lsub -o libmain.so  main.o

    此命令可編譯並鏈接通過,而且ldd -r libmain.so也會發現對libsub.so的依賴。

 

總結:

  -L:只是在編譯時指定庫的位置,但是運行時無法找到該位置;

  -rpath和-rpath-link都可以在鏈接時指定庫的路徑。

    但是運行時,-rpath-link指定的路徑就不再有效,因為鏈接器沒有將庫的路徑包含進可執行文件中或庫中;

    而-rpath指定的路徑,已被鏈接器寫入可執行文件中或庫中


免責聲明!

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



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