
我想這個問題是 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_PATH
,LD_LIBRARY_PATH
,CPLUS_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
-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