現要在目錄 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指定的路徑,已被鏈接器寫入可執行文件中或庫中