GCC/G++選項-Wl,——rpath=
我們知道,GCC/G++提供了-L選項用於鏈接時指定要鏈接的庫的路徑,但是這個選項只限於編譯時,在運行時,可執行文件並未記住鏈接庫的路徑,因此在程序初始化的時候,動態加載程序會報告找不到動態庫錯誤。
示例代碼如下:
test.cc:
#include
void dumpTest() {
std::cout << "This is dumpTest" << std::endl;
}
main.cc:
#include
extern void dumpTest();
int main() {
std::cout << "This is Linux platform" << std::endl;
dumpTest();
return 0;
}
說明:test.cc編譯成 libtest.so,main.cc鏈接 libtest.so生成可執行文件main。
問題:
使用如下命令編譯main,在運行時報告找不到 libtest.so:
g++ -L./yepanl -o main main.cc -ltest
運行結果如下:
$ ./main
./main: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
解決辦法一:
設置運行時環境變量 LD_LIBRARY_PATH,這種情況適用於嵌入式運行等環境:
export LD_LIBRARY_PATH=./yepanl:$LD_LIBRARY_PATH
解決辦法二:
編譯鏈接可執行文件時,增加 -Wl,--rpath=選項,鏈接器在可執行文件頭中記錄動態庫的路徑,動態加載器運行時讀取動態庫路徑,加載動態庫。這種情況適用於主機開發運行環境:
g++ -L./yepanl -o main main.cc -ltest -Wl,--rpath=./yepanl
總結:-L選項用於鏈接時搜索動態庫,-Wl,--rpath=用於運行時搜索動態庫。
查看原文 >>