2017-11-10 271 views
1

(我想使這個問題儘可能的通用,所以我會省略名稱圖書館,給了我標題問題。)程序錯誤:./program:錯誤而載入共享庫:LIB <xxx>的.so:無法打開共享對象文件:沒有這樣的文件或目錄

我有一個項目,併爲該項目,我需要一個圖書館xxx。因此,我下載了該庫,使用默認命令(./configure && make && make install && make clean)進行編譯 - 安裝過程已記錄 - 如果文檔中給出的示例用於查看是否正確設置了所有內容,則嘗試嘗試。我複製並粘貼在.c文件的代碼,並用下面的命令編譯它:

gcc -o program program.c -lxxx 

和GCC沒有報告任何錯誤。然而,當我運行程序時,會出現以下錯誤:

./program: error while loading shared libraries: lib<xxx>.so: cannot open shared object file: No such file or directory 

是到了我的心是用-static gcc的選項的第一個解決方案。它運行良好,程序正常運行。但我感到失望,因爲這意味着圖書館「嵌入」在程序中(抱歉在這裏錯誤的術語:我只是一個學生)。

於是,我找了在堆棧溢出的解決方案:這是我的發現:error while loading shared libraries: libnsd.so: cannot open shared object file: No such file or directory

圖書館是不同的,但使用命令

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

工作的罰款。實際上,libxxx.so位於/ usr/local/lib(僅通過使用ls /usr/local/lib | grep xxx)。另外,永久的解決方案線程顧名思義就是在文件/etc/ld.so.conf寫的目錄名稱:

sudo echo "/usr/local/lib" >> /etc/ld.so.conf 
sudo ldconfig 

這就是棘手的問題:ld.so.conf中文件包含以下行

include /etc/ld.so.conf.d/*.conf 

和目錄內/etc/ld.so.conf.d有一個名爲libc.conf包含行

/usr/local/lib 

我有點困惑,其中包括;如果它的工作方式與C#中的#include一樣,我應該在/etc/ld.so.conf文件中包含/ usr/local/lib。看起來並非如此。

+0

你安裝庫後運行'rehash'嗎? –

+0

該問題與C無關。 – alk

+0

[man ldconfig](https://linux.die.net/man/8/ldconfig) –

回答

3

/etc/ld.so.conf僅被ldconfig讀取,其使用它來填充動態加載器高速緩存/etc/ld.so.cache。如果將庫裝入/usr/local/lib,並且/usr/local/lib包含在通過該機制的搜索路徑中,則只有在首先運行ldconfig時,它纔可以使用(不需要設置LD_LIBRARY_PATH)。

+0

嗨,對於遲到的回覆感到抱歉,並且非常感謝您回覆我的主題。我對ld.so.cache不瞭解......我會對此進行一些調查研究。無論如何,運行ldconfig已經解決了這個問題。所以,每當我在/ usr/local/lib中安裝一個動態加載庫時,我需要刷新緩存文件,不是嗎? – LuxGiammi

+0

是的,建議在系統範圍庫安裝後運行'ldconfig'。 –

相關問題