2009-09-25 49 views
2

我的工作雖然First Steps教程在POCO項目工地,我已經成功地構建了庫(Debian的Linux中,2.6.26,GCC 4.3.2),我的主目錄下的Linux運行時鏈接錯誤

~/Development/POCO

與位於

~/Development/POCO/lib/Linux/x86_64/lib

我的問題的共享庫是我建立的任何應用程序依賴這些庫只能從共享庫目錄中運行。

 
~/Development/POCO/lib/Linux/x86_64$ ldd ~/Development/Cloud/DateTimeSample/bin/Linux/x86_64/DateTime 
     linux-vdso.so.1 => (0x00007fffe69fe000) 
     libPocoFoundation.so.6 (0x00007fa8de44f000) 
     libpthread.so.0 => /lib/libpthread.so.0 (0x00007fa8de233000) 
     libdl.so.2 => /lib/libdl.so.2 (0x00007fa8de02f000) 
     librt.so.1 => /lib/librt.so.1 (0x00007fa8dde26000) 
     libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fa8ddb1a000) 
     libm.so.6 => /lib/libm.so.6 (0x00007fa8dd897000) 
     libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fa8dd680000) 
     libc.so.6 => /lib/libc.so.6 (0x00007fa8dd32d000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007fa8de7e0000) 

並且從該目錄運行DateTime將按您的預期工作。然而

 
~/Development/Cloud/DateTimeSample/bin/Linux/x86_64$ ldd DateTime 
     linux-vdso.so.1 => (0x00007fff24dfe000) 
     libPocoFoundation.so.6 => not found 
     libpthread.so.0 => /lib/libpthread.so.0 (0x00007ffc1c7dd000) 
     libdl.so.2 => /lib/libdl.so.2 (0x00007ffc1c5d9000) 
     librt.so.1 => /lib/librt.so.1 (0x00007ffc1c3d0000) 
     libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007ffc1c0c4000) 
     libm.so.6 => /lib/libm.so.6 (0x00007ffc1be41000) 
     libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007ffc1bc2a000) 
     libc.so.6 => /lib/libc.so.6 (0x00007ffc1b8d7000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007ffc1c9f9000) 

因此在運行任何其他目錄的結果中可執行

 
error while loading shared libraries: libPocoFoundation.so.6: cannot open shared object file: No such file or directory 

望着從化妝過程的輸出,該目錄正確指定

 
g++ [blah] -L/home/npalko/Development/POCO/lib/Linux/x86_64 
      -lPocoFoundation 

我試着將

LD_LIBRARY_PATH
設置爲
/home/npalko/Development/POCO/lib/Linux/x86_64
,但它沒有改變任何東西。任何幫助將不勝感激!

+0

啊,我的問題是,我已經錯誤地設置LD_LIBRARY_PATH。更多的是對Bash的誤解,而不是其他任何事情。非常感謝你的幫助! – 2009-09-30 19:37:47

回答

6

如果您不想處理LD_LIBRARY_PATH變量,則可以將鏈接器-rpath選項添加到gcc命令行。在你的情況,這將是:

gcc ... -Wl,-rpath=/home/npalko/Development/POCO/lib/Linux/x86_64 

這有效地在硬編碼的可執行文件路徑,因此它可能會或可能不適合你的目的。

+0

美麗,謝謝! – 2009-09-30 19:38:22

2

這會失敗嗎?

LD_LIBRARY_PATH=/home/npalko/Development/POCO/lib/Linux/x86_64 ~/Development/Cloud/DateTimeSample/bin/Linux/x86_64/DateTime 

只是想你可能沒有正確設置LD_LIBRARY_PATH

這個呢?

ls -alh /home/npalko/Development/POCO/lib/Linux/x86_64/libPocoFoundation.so 

如果兩者都失敗,我看不到原因。

+1

設置LD_LIBRARY_PATH通常是一個壞主意:您的二進制文件適用於您(有時)但不適合您的朋友,或者您忘記在演示文稿之前設置它。在靜態鏈接時使用-rpath通常是更好的選擇。 – 2009-09-26 23:02:36

1

您必須指定鏈接庫的路徑

g++ [blah] -Wl,-rpath=/home/npalko/Development/POCO/lib/Linux/x86_64 

-Wl意味着你將一個選項傳遞給連接器

-rpath是連接選項

將目錄添加到運行時庫搜索路徑。鏈接ELF可執行文件與共享對象時,這用於 。所有-rpath 參數被連接並傳遞給運行時鏈接程序,該鏈接程序在運行時使用它們來定位共享對象。-rpath選項 也用於查找明確包含在鏈接中的共享對象所需的共享對象;

+0

+1。拉着我的頭髮試圖找出如何使用-R鏈接時gcc調用鏈接器。你的回答比公認的答案要好得多。謝謝! – jj33 2010-12-08 15:39:24

相關問題