我們知道,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=用於運行時搜索動態庫。

查看原文 >>
相關文章