2013-07-26 69 views
24

我建立使用一種稱爲ohNet框架的應用程序。 構建框架後,可以通過make install安裝框架。默認情況下,庫安裝在/usr/local/[lib|include]文件夾內。好。庫在/ usr/local/lib目錄未找到

我使用Eclipse進行開發。爲了使用這個庫我必須設置包含路徑庫(在這種情況下usr/local/include/ohNet),設置鏈接的搜索路徑(-L)(/usr/local/lib/ohNet)和特定的庫(-l)(在這種情況下,我選擇庫所謂libohNet.so是此文件夾中 當我在Eclipse中構建它工作正常的項目,但如果我嘗試運行我面對以下消息PROGRAMM:

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

我仔細檢查過這一點,並且文件libohNet.so在該目錄下! 那是什麼這個文件無法找到原因?

我搜索谷歌和發現了一些帖子,說是有問題的,圖書館越來越安裝到/usr/local/lib,而不是/usr/libsee here ...... 我一定要在eclipse配置一些額外的設置,使ld認識圖書館在這條道路?這有什麼解決方案?

關於

+0

將'-L/usr/local/lib'添加到鏈接器行。 –

+0

我已經設置鏈接器的搜索路徑爲'/ usr/local/lib/ohNet' – Moonlit

+0

然後你需要檢查你是否可以真正讀取文件,並且它是.so文件的正確類型 - 例如,混合32和64位? –

回答

43

這是一個運行時錯誤,而不是構建錯誤。設置-L標誌對運行時鏈接程序沒有任何作用。你需要做的是告訴運行時加載器在/ usr/local/lib中查找庫。你可以用兩種方法來做到這一點。第一種是向路徑添加到LD_LIBRARY_PATH環境變量:

 
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" 

第二個是更新運行時鏈接的配置文件。發生這種情況無論是在文件/etc/ld.so.conf,通過將線:

 
/usr/local/lib 

某處在該文件中,或者在/etc/ld.so創建一個新的* .conf文件.conf.d /包含新路徑的目錄。例如:

 
/etc/ld.so.conf.d/99local.conf 

只:

 
/usr/local/lib 

。這是這樣做的推薦方式,因爲它允許您將自定義庫路徑與系統設置的路徑分開。 (「99」前綴用於確保文件最後加載與其他文件相比較,因此它不會搶佔可能包含相同庫的系統路徑。)

修改/創建文件後在/ etc中,您需要運行:

 
ldconfig 

作爲更改生效的根。 (該命令更新的文件/etc/ld.so.cache,這是由運行時鏈接使用的實際文件。)

還有另一種方式爲二進制找到所需的庫在運行時。您實際上可以將庫路徑硬編碼到可執行文件本身。這是通過設置所謂的「rpath」來完成的。這是一個鏈接器選項,必須從gcc(或g ++)傳遞給鏈接器,因此必須使用-Wl選項。鏈接器選項是-rpath=PATH。所以你需要把它添加到你的鏈接標誌:

 
-Wl,-rpath=/usr/local/lib 

我不推薦這個你的情況。當您將庫與可執行文件(可能包含安裝程序)一起運輸時,rpath非常有用,然後使用相對路徑(使用rpath $ORIGIN功能)或絕對路徑(例如,當您安裝在/ opt中時)用於在運行時查找捆綁的庫。

+0

謝謝你的確切答案。如果我的庫位於/ usr/local/lib的子文件夾中(例如/ usr/local/lib/ohNet),則必須將每個路徑添加到子文件夾。有沒有辦法告訴運行時加載器以遞歸方式在/ usr/loal/lib中搜索? – Moonlit

+0

@ user1291235您必須在其自己的行中分別添加每個單獨的路徑。 –

+1

@ user1291235我忘了提及rpath鏈接選項。我不建議你這樣做,但很高興知道,所以我已經將它添加到答案中。 –