2016-05-18 119 views
2

我在路徑/home/test/lib/libTest.so中有一個.so和一個名爲myexec的可執行文件,它是用指向/home/test/lib/RPATH構建的。但是,當我在myexec上執行ldd時,它說libTest.so找不到,我不得不爲export LD_LIBRARY_PATH工作。在可執行文件中找不到C++動態鏈接庫

我已經證實:

  1. libTest.so/home/test/lib/
  2. objdump -x myexec | grep RUNPATH確實存在,並表示/home/test/lib/被內置於可執行文件。

有沒有人知道爲什麼它不能找到圖書館沒有設置LD_LIBRARY_PATH

+0

[MVCE](http://stackoverflow.com/help/mcve)需要, –

回答

1

here

在Linux中,環境變量LD_LIBRARY_PATH是一個冒號分隔的組的目錄,其中庫應該被搜索的第一,標準組目錄

作爲前提示,你應該小心不要完全替換你的LD_LIBRARY_PATH。它可能會弄亂系統共享庫的路徑。 始終使用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/path

編輯1:

對於rpath,確保libTest.so不依賴於任何其他庫。作爲替代方案,你可以在GCC的替代-rpath使用-rpath-link選項,如圖here

-rpath-LINK DIR

當使用ELF或SunOS中,一個共享庫可能需要另一個。當ld -shared鏈接包含共享庫作爲其中一個輸入文件時,會發生這種情況。當鏈接器在執行非共享的不可重定位鏈接時遇到這種依賴關係時,它會自動嘗試查找所需的共享庫並將其包含在鏈接中(如果未明確包含它)。在這種情況下,-rpath-link選項指定要搜索的第一組目錄。

編輯2:

如果你想要更多的幫助,請提供:

  1. 精確參數編譯
  2. 輸出爲ldd /path/to/binary命令
  3. 輸出過程中用於readelf -d /path/to/binaryrpath
+1

這是否真的解決了這個問題? OP詢問爲什麼當需要的路徑已經構建到可執行文件中時,外部環境變量('LD_LIBRARY_PATH')是必需的。 – Spencer

+0

我承認答案並不令人滿意。我剛剛編輯它請求更多信息。對於那個很抱歉。 –

相關問題