2014-09-02 40 views
0

運行應用程序時由其他人開發的,得到以下錯誤無法加載共享庫:libxerces.so

./appln: error while loading shared libraries: libxerces-c.so.28: cannot open shared object file: No such file or directory 

如果我運行ldd命令:

# ldd appln 
linux-gate.so.1 => (0x00e20000) 
libdl.so.2 => /lib/libdl.so.2 (0x00a61000) 
libxerces-c.so.28 => not found 

我已經有了當前文件夾中的libxerces-c.so.28文件。請幫助我如何解決該錯誤

回答

3

您需要將libxerces-c.so放在庫路徑的某處。可能當前文件夾不會搜索庫。嘗試把它放在/usr/local/lib

+0

現在我發現它已經存在在/ usr/local/lib目錄,但仍然得到錯誤 – 2014-09-02 07:42:48

+0

或只是做了'須藤讓install'如果你有建立它(或'sudo ldconfig') – sop 2014-09-02 07:50:18

2

默認情況下.so文件不在當前文件夾中搜索(它們應該在/ usr/lib等)。 要增加當前目錄中。所以查找使用:

LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH ./appln 
+0

$ LD_LIBRARY不存在於我的redhat linux – 2014-09-02 07:48:16

+0

對不起,我犯了一個錯字,現在已經更正了。 – glezmen 2014-09-02 07:50:11

2

顯然「當前文件夾」是不是由你的可執行文件使用的運行時搜索路徑。我假設你在linux上(linux-gate.so.1)。

您需要確保「當前」目錄在搜索路徑下。如果您通過編譯器前端調用鏈接程序,則可以在鏈接時使用鏈接器的-rpath選項(也接受-R)或-Wl,-rpath,<dir>來在鏈接時執行此操作。這將在運行時將嵌入的搜索路徑嵌入到您的程序中。

儘管如此,請考慮如何安裝程序。添加特定於您的開發環境的路徑沒有任何意義。您可能需要考慮使用$ORIGIN$ORIGIN相對路徑,它告訴運行時鏈接程序在包含(或相對於)可執行文件的位置中查找共享對象。您應該始終避免將.添加到運行時搜索路徑;根據調用它的進程的當前目錄,你的程序不應該有不同的表現。

作爲一種臨時措施,您可以設置環境變量LD_LIBRARY_PATH來覆蓋嵌入式和系統搜索路徑,但依靠LD_LIBRARY_PATH覆蓋進行最終安裝通常是一個壞主意。

+0

我正在使用redhat enterprise linux,我需要執行的完整命令是什麼 – 2014-09-02 07:47:07

+0

@RajeshKumar:我不知道你需要執行的copmlete命令是什麼,因爲我不知道你現在如何鏈接你的可執行文件。 – 2014-09-02 07:49:52

2

當(在/usr/local/lib/如)你最好添加目錄(/usr/local/lib/)曾經在你的/etc/ld.so.conf,你應該運行ldconfig更新鏈接器緩存(每次添加內/usr/local/lib/一些時間)

增加新的「本地系統」庫

ldconfig(8)ld.so(8)ldd(1)dlopen(3)

如果你想自己的庫,設置LD_LIBRARY_PATH包含他們的目錄(如$HOME/lib/和標準目錄,例如

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

~/.bashrc(但我不喜歡那個混亂的做法,並希望自行管理我的/usr/local/lib/)。

你也可以使用一些-Wl,-rpath argument但我真的不喜歡這一點。

閱讀也Program Library HowToDrepper's paper: How To Write Shared Libraries

+0

這個答案我最喜歡。 – 2014-09-02 09:15:36