如何配置我的環境以使用正確的(與系統版本不同的)庫版本

如何配置我的環境以使用正確的(與系統版本不同的)庫版本

我想這個問題是 ServerFault 和 StackOverflow 與此網站之間的邊界。但我認為 U&L 是最相關的。

我有一些C++程式碼依賴版本中的庫X,並且系統提供了版本Y(X>Y)。我已經編譯了這個庫並將生成的文件放入/opt/lib_name/X/lib,版本Y安裝在/usr/lib64.我想連結到so庫。

現在我想建立一些以某種方式啟用 version 的腳本X,因此我建立的任何程式碼gcc都會針對 version 進行編譯,X而無需對 makefile 進行任何更改。

現在我設定了LIBRARY_NAME_DIR一個變量,並在 makefile 中附加了它-L $LIBRARY_NAME_DIR,它可以工作,但需要我更改 makefile。

有什麼方法可以在沒有電腦 root 存取權限的情況下執行此類操作。

注意:雖然我相信這個問題的答案並不取決於特定的庫或程式碼,但我的特定問題的所有詳細資訊都在這裡:https://stackoverflow.com/q/24189130/7918

我嘗試過的:

  • 我已經設定:LIBRARY_PATHLD_LIBRARY_PATHCPLUS_INCLUDE_PATH

答案1

我認為沒有任何方法可以純粹透過環境變數來穩健地做到這一點。使用的問題LIBRARY_PATH似乎是任何給定的-L選項都有優先權。如果由於任何原因gcc命令有-L/usr/lib64,將首先搜尋該命令,然後找到舊版本的庫。看起來你要更改Makefiles,你也應該注意a-L/usr/lib64不會先出現。

不過,看看你的問題,上面的問題似乎不是問題。但是,變數:的值有不必要的尾隨LIBRARY_PATH,這可能可以解釋為什麼它不起作用。

另外,正如 SO 問題的答案中所指出的,LD_LIBRARY_PATH由動態連結器使用,並且僅在以下位置相關:運行為您的應用程式。如果應用程式在運行時找不到動態庫的位置,則可以使用此方法。 GNU 連結器使用的是LD_RUN_PATH,它基本上執行for 的-rpath操作,除了指定將被忽略的任何手段(而不僅僅是給予較低的優先權)。LIBRARY_PATH-rpath-rpathLIBRARY_PATH

那你可以嘗試的是:

LIBRARY_PATH=/opt/lib_name/X/lib LD_RUN_PATH=/opt/lib_name/X/lib make

可能更強大的方法是建立一個gcc包含必要選項的包裝腳本,例如:

#!/bin/sh
gcc -L/opt/lib_name/X/lib -Wl,-rpath,/opt/lib_name/X/lib "$@"

將檔案命名為gcc,使其可執行並將其單獨放入目錄中(或至少放在一個不存在與重要命令同名的檔案的目錄中)。然後你可以make像這樣運行:

PATH=/path/to/script:$PATH make

相關內容