2012-12-05 223 views
2

我正在試圖在Ubuntu Linux上構建和使用共享庫的this pagethis page中的解釋如下。使用共享庫的問題

我正在使用PC上的交叉編譯器構建庫和應用程序,而不是將文件複製到目標系統並在那裏運行。

最後,我處於正確定義所有符號鏈接的階段,我能夠運行應用程序 - 但不是以所需的形式。

比方說,我有一個共享庫libtest.so.1.0在目錄/home/ysap/libs。然後,我在同一個目錄中創建了符號鏈接libtest.so.1libtest.so,它們都指向庫文件。我的應用程序app.e使用test庫。

現在,運行應用程序,我可以輸入:

> LD_LIBRARY_PATH=/home/ysap/libs ./app.e 

和應用很好地運行。不過,我想消除分配,所以我嘗試打字:

> export LD_LIBRARY_PATH=/home/ysap/libs 
> ./app.e 

但不幸的是我得到一個錯誤信息,說:

./app.e: error while loading shared libraries: libtest.so.1: cannot open shared object file: No such file or directory

我也試過打字:

> ldconfig -n /home/ysap/libs 

and

> sudo ldconfig -n /home/ysap/libs 

但它沒有幫助。

我在做什麼錯?我怎樣才能使app.e運行W/O變量賦值?


更新1

應用程序使用mmap()調用,因此它必須與須藤特權運行。實際調用行是:

> sudo LD_LIBRARY_PATH=/home/ysap/libs ./app.e 

是否有可能在export -ed變量沒有更新須藤環境?


更新2

輸出的

ldd ./app.e:從用戶指定的路徑

libtest.so.1 => /home/ysap/libs/libtest.so.1 (0xb6faa000) 
libgcc_s.so.1 => /lib/arm-linux-gnueabi/libgcc_s.so.1 (0xb6f85000) 
libc.so.6 => /lib/arm-linux-gnueabi/libc.so.6 (0xb6ea4000) 
/lib/ld-linux.so.3 (0xb6fb7000) 
+0

什麼的ouptup被動態加載:LDD ./app.e? – coelhudo

+0

@ coelhudo - 請參閱問題中的更新2。 – ysap

回答

4

sudo問題與@duskwuff狀態一樣,但如果要編譯應用程序,而不需要修改LD_LIBRARY_PATH變量,則在鏈接應用程序時,可以使用$ORIGIN變量,該變量由最新版本的Linux操作系統。編譯時

-Wl,-R'$ORIGIN' 

你需要引用的選項,以防止它被外殼擴展:

如果所有的庫在當前目錄中,那麼當你鏈接的應用程序,可以使用額外的選項。

如果你把它變成一個Makefile然後使用:

-Wl,-R\$$ORIGIN 

$$是化妝使用$時,\是防止從命令行擴大調用的殼在將它傳遞給命令前變量。

您可以使用任何符號路徑引用,因此如果您的結構中的二進制文件位於bin/且庫位於lib/中,則可以使用$ORIGIN/../lib

這適用於dlopen爲好,這樣就會發現庫的時候都在運行時

+0

Thenks。所以...在兩臺機器上回顯$ ORIGIN都會返回一個空字符串。在構建腳本中(它不是目標機器上的*),我嘗試了這個選項的幾個版本,但是我一直在收到構建錯誤。基本上,我試圖在目標機器上提供路徑,但是在構建機器上,此路徑不存在,因此鏈接器吐出一個錯誤。 -R $ ORIGIN選項是否只期望相對路徑? – ysap

+0

您正試圖將'$ ORIGIN'值傳遞給鏈接器,而不會被shell擴展,所以如果您使用shell腳本來執行編譯,則需要單引號。 -Wl,-R'$ ORIGIN' - 我把單引號放在文本的周圍,我想這會解釋需要做什麼 – Petesh

+0

好吧,我想我找到了問題。圍繞該選項,我錯誤地使用了前面引號而不是引號。一旦糾正,現在看起來好了。 – ysap

2

加載庫是一個安全隱患,所以sudo總是剔除掉所有LD_環境變量,包括LD_LIBRARY_PATH

+0

我明白了,謝謝。那麼,如果有的話,這個問題的解決方案是什麼?我註定每次分配這個變量嗎?是唯一的解決方法創建一個包裝腳本? – ysap

+0

您將需要創建包裝腳本,或重新鏈接可執行文件,以便不再需要設置'LD_LIBRARY_PATH'。 – duskwuff

+0

你能否詳細說明第二種選擇(如果要添加到@ Petesh的答案)? – ysap