簡體   English   中英

LD_LIBRARY_PATH優先級和編譯問題

[英]LD_LIBRARY_PATH precendence and trouble with compiling

我試圖在Linux機器上安裝一些軟件(python的rpy2包,特別是rpy2.robjects,如果重要的話)。 我需要軟件在我的本地空間中查找它的共享庫,而不是像/ usr / lib64這樣的全局空間。 我沒有這台機器的管理員權限。 我的問題是,即使我將LD_LIBRARY_PATH設置為指向我的本地空間,軟件仍會轉到/ usr / lib64 / whatever,它會找到過時的庫。 這些庫缺少它需要的一些對象,因此失敗了。 什么可以優先於LD_LIBRARY_PATH,有沒有辦法改變/擺脫它? 謝謝。

順便說一下,這個網站上的某個人在一年或更久以前有類似的問題,但他的答案涉及env變量RPATH,並使用chrpath實用程序更改它。 我根本不清楚rpy2是否使用RPATH,並且chrpath似乎在我的系統上不可用。

附錄:我嘗試使用LD_DEBUG = libs運行。 有很多輸出,看起來系統正在我的LD_LIBRARY_PATH中尋找lib並找到它們。 這是麻煩似乎開始的地方:

/usr/local/lib64/R/library/methods/libs/methods.so: error: symbol lookup error:
undefined symbol: Rf_allocS4Object (fatal)
Error in dyn.load(file, DLLpath = DLLpath, ...) : 
unable to load shared object '/usr/local/lib64/R/library/methods/libs/methods.so':
/usr/local/lib64/R/library/methods/libs/methods.so: undefined symbol: Rf_allocS4Object

所以我的猜測是,問題是DLLpath中的任何內容都會覆蓋LD_LIBRARY_PATH。 我試圖通過將我的目錄添加到os.environ ['PATH']來改變這種情況,但是沒有。 顯然沒有“DLLPATH”,因為我認為會有。

好吧,我猜這是進步。 有人還有別的嗎? 謝謝。

看一下名為$ R_HOME / etc / ldpaths的文件(在你的情況下,$ R_HOME似乎是/ usr / local / lib64 / R)。 這個文件中的命令在R的啟動時設置LD_LIBRARY_PATH

我看起來像這樣:

flodel@netbook-samsung-N150:~$ cat /usr/lib/R/etc/ldpaths 
: ${JAVA_HOME=/usr/lib/jvm/java-6-openjdk/jre}
: ${R_JAVA_LD_LIBRARY_PATH=${JAVA_HOME}/lib/i386/client:${JAVA_HOME}/lib/i386:/usr/lib/jni}
if test -n ""; then
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib:}
else
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib}
fi
if test -n "${R_JAVA_LD_LIBRARY_PATH}"; then
  R_LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}:${R_JAVA_LD_LIBRARY_PATH}"
fi
if test -z "${LD_LIBRARY_PATH}"; then
  LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}"
else
  LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}:${LD_LIBRARY_PATH}"
fi
export LD_LIBRARY_PATH

如果您沒有該文件的寫入權限,您仍然可以在啟動R之前執行此操作:

export R_LD_LIBRARY_PATH=/your/custom/path

我在我的機器上測試了它在R啟動后通過運行以下命令來工作:

Sys.getenv("LD_LIBRARY_PATH")
#[1] "/your/custom/path:/usr/lib/jvm/java-6-openjdk/jre/lib/i386/client:/usr/lib/jvm/java-6-openjdk/jre/lib/i386:/usr/lib/jni"

如果有人還在讀這個,我參與了一些“人事工程”來解決問題,即讓系統管理員重新安裝R,以便它擁有我需要的一切。 他們當然很好。 非常感謝所有提出建議的人。 我想繼續其中一些,但我必須忙於這個項目。 非常感謝!

RPATH僅在編譯時有用(好吧,鏈接); 它會影響到二進制文件中的庫搜索路徑。

嘗試使用LD_DEBUG=libs運行,這將顯示從哪些路徑加載庫。 它是否嘗試從LD_LIBRARY_PATH加載但是失敗,或者首先不在那里搜索(也許rpy2有自己的庫路徑機制?),還是其他什么?

嘗試添加LD_LIBRARY_PATH左側的目錄,因為優先級從左到右。

export LD_LIBRARY_PATH=~/your/custom/path:$LD_LIBRARY_PATH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM