如何以使用正確(不同於系統版本)庫的方式配置我的環境
我猜這個問題是 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