Rhel

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

  • June 13, 2014

我猜這個問題是 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中我只是 append -L $LIBRARY_NAME_DIR,它可以工作但需要我更改makefile。

有沒有辦法在沒有 root 訪問電腦的情況下做這種事情。

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

我試過的:

  • 我設置了:LIBRARY_PATH, LD_LIBRARY_PATH, CPLUS_INCLUDE_PATH.

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

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

此外,如 SO 問題的答案中所述,LD_LIBRARY_PATH動態連結器使用它,並且僅在執行時與您的應用程序相關。如果在執行應用程序時無法找到動態庫的位置,則可以使用此選項。GNU 連結器使用的是LD_RUN_PATH,它本質上是為 for-rpath所做LIBRARY_PATH-rpath,除了指定將被忽略的任何-rpath手段LIBRARY_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

引用自:https://unix.stackexchange.com/questions/136948