我正在以非 root 使用者身分在伺服器上安裝程式。具體來說,它是 tmux 1.5,但在我看來,這應該廣泛適用於所有本地安裝的程式(我提到程式名稱,以防這個問題最終不是我自己的錯誤)。
程式要求我安裝一些依賴函式庫(例如libevent和ncurses)。所以,我在本地安裝了它們,因為我沒有 root 存取權限
cd $HOME/library/installation/folder
DIR=$HOME/local
./configure --prefix=$DIR
#... make ... make install
現在,要安裝該程序,我還必須包含庫包:
cd $HOME/program/installation/folder
./configure --prefix=$DIR CFLAGS="-I$DIR/include" LDFLAGS="-L$DIR/lib"
#... make ... make install
好的,這樣就可以毫無問題地將程式安裝到 $HOME/local/bin 中,但是如果我執行可執行檔: $HOME/local/bin/tmux ,則會出現以下錯誤:
tmux:載入共用程式庫時發生錯誤:libevent-2.0.so.5:無法開啟共用物件檔案:沒有這樣的檔案或目錄
在我看來,程式找不到所需的庫,但檔案 libevent-2.0.so.5 確實存在於配置選項中指定的 $HOME/local/lib 中。我想知道如何讓程式識別已安裝的庫以便運行。我嘗試將符號連結放入 $HOME/lib、$HOME/bin 和 $HOME/local/bin 中,但這些都不起作用。任何想法和建議將不勝感激
答案1
嘗試使用重建 libevent
./configure --disable-shared
我懷疑這會解決您的問題,因為在構建二進製文件時將鏈接該庫,並且不需要在運行時搜索。
或者,如果您需要動態連結的 libevent,可以將 libevent-2.0.so.5 的包含目錄新增至 LD_LIBRARY_PATH 環境變數:
export LD_LIBRARY_PATH=${HOME}/local/lib/:${LD_LIBRARY_PATH}
答案2
您也可以設定 RPATH,其中將庫搜尋補丁編碼到二進位檔案本身中。
只需添加-R $DIR/lib
到CFLAGS
.
答案3
我問了類似的問題,有趣的是關於tmux
所有東西的構建,儘管我仍然確信這不應該適用於 GNUconfigure
和GNUmake
一起使用的任何情況。
我相信更乾淨的方法是利用所謂的“rpath” - 嵌入在二進位檔案中的庫搜尋路徑。-rpath
至少 GNU 連結器的開關允許ld
指定“rpath”。
建置命令列將如下所示:
PKG_CONFIG_PATH=/path/to/libevent/lib/pkg-config LDFLAGS=-Wl,-rpath,/path/to/libevent/lib ./configure ...
這裡並不是最重要的,但PKG_CONFIG_PATH
上面只是推薦的方法來完成人們手動發送-L/path/to/libevent/lib -I/path/to/libevent/include
到./configure
腳本的任務。當您建置 時libevent
,它會安裝自己的設定檔pkg-config
(由./configure
)使用。你應該使用它,因為只有libevent
確實知道建造時應該使用哪些開關。
無論如何,在某些情況下,-rpath
這是解決問題的更乾淨的方法。
LD_LIBRARY_PATH
然而,基於 -的解決方案允許您在運行時處理已建置的二進位檔案所使用的庫,這有時是可取的。但是,如果您只想針對某個特定的庫進行構建,您已將其放在主資料夾中的某個專用位置,那麼我認為-rpath
基於 - 的解決方案將被視為規範的答案。
奇怪的是為什麼tmux
'自己的建置腳本在建置過程中不會從庫搜尋路徑推斷出此路徑。也許他們不需要也不應該,我不知道。這發生在我們建造者身上是巧合嗎tmux
?
答案4
其他人沒有運氣,但這對我有用,從這裡:
sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5