Environment-Variables

正確設置 LD_LIBRARY_PATH

  • January 20, 2021

我正在使用帶有 Ubuntu 16.04 映像的 Docker。我正在使用這個 docker 執行:

  • 借助 boost.python 在 python 中導入 C++ 類
  • 借助 Matlab Runtime (MCR) 在 python 中導入 matlab 的 python 包。

在我在 docker 中安裝 MCR 之前,我已經使用以下方法安裝了 boost:

$ sudo apt-get install -y libboost-all-dev

我能夠包裝 C++ 類並在 python 中呼叫它們。然後我安裝了 MCR,其中一項要求是設置LD_LIBRARY_PATH為 Matlab 的庫。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/MATLAB/MATLAB_Runtime/v94/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v94/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v94/sys/os/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v94/extern/bin/glnxa64

它起作用了,我能夠在 python 中執行 matlab 的 python 包,但是由於LD_LIBRARY_PATH. 例如,當我嘗試在 python 中導入 C++ 類時出現以下錯誤:

/usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0: undefined symbol: XML_SetHashSalt

如果我取消設置LD_LIBRARY_PATHC++ 導入工作但 MCR 失敗。那麼問題LD_LIBRARY_PATH應該是什麼才能成功執行 C++ 類和 Matlab 的 python 包?

我試圖添加路徑來提升庫LD_LIBRARY_PATH但沒有工作,所以 env 值將是:

/usr/lib/x86_64-linux-gnu:/usr/local/MATLAB/MATLAB_Runtime/v94/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v94/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v94/sys/os/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v94/extern/bin/glnxa64

編輯

設置之前的 C++ 庫文件的依賴項LD_LIBRARY_PATH

   linux-vdso.so.1 (0x00007ffcee0dc000)
   libpython3.4m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0 (0x00007f9d69e59000)
   libboost_python-py34.so.1.55.0 => /usr/lib/x86_64-linux-gnu/libboost_python-py34.so.1.55.0 (0x00007f9d69c09000)
   libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f9d698fe000)
   libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9d695fd000)
   libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f9d693e7000)
   libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9d6903c000)
   librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f9d68e34000)
   libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f9d68c0b000)
   libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f9d689f0000)
   libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9d687d3000)
   libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9d685cf000)
   libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f9d683cc000)
   /lib64/ld-linux-x86-64.so.2 (0x00007f9d6a6c3000)

設置後the LD_LIBRARY_PATH

   linux-vdso.so.1 (0x00007ffc42e9b000)
   libpython3.4m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0 (0x00007fad9635b000)
   libboost_python-py34.so.1.55.0 => /usr/lib/x86_64-linux-gnu/libboost_python-py34.so.1.55.0 (0x00007fad9610b000)
   libstdc++.so.6 => /usr/local/MATLAB/MATLAB_Runtime/v94/sys/os/glnxa64/libstdc++.so.6 (0x00007fad95d8a000)
   libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fad95a89000)
   libgcc_s.so.1 => /usr/local/MATLAB/MATLAB_Runtime/v94/sys/os/glnxa64/libgcc_s.so.1 (0x00007fad95873000)
   libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fad954c8000)
   librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fad952c0000)
   libexpat.so.1 => /usr/local/MATLAB/MATLAB_Runtime/v94/bin/glnxa64/libexpat.so.1 (0x00007fad95095000)
   libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fad94e7a000)
   libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fad94c5d000)
   libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fad94a59000)
   libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fad94856000)
   /lib64/ld-linux-x86-64.so.2 (0x00007fad96bc5000)

你有幾個選擇:

  1. export在上面的語句中為共享庫的路徑添加前綴(很可能$LD_LIBRARY_PATH沒有在您的系統上設置,因此唯一設置的路徑是在您的導出語句中明確設置的路徑。)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/:/usr/lib/:/usr/lib64/:/usr/local/MATLAB/MATLAB_Runtime/v94/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v94/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v94/sys/os/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v94/extern/bin/glnxa64

除非您將它添加到fyi ,否則該export語句不會成為您的 shell 會話的永久部分。.bashrc 2. 將 MATLAB 庫路徑添加到/etc/ld.so.conf.d/並執行ldconfig以辨識系統上鍊接器的新路徑。

(順便說一句,我在猜測MATLAB庫名稱。您可能需要將文件的名稱設置為不同於MATLAB全小寫或其他名稱。基本上我們需要在連結過程中引用的庫名稱。您可以檢查 make 文件以查看它是如何引用的。)

# Add the file '/etc/ld.so.conf.d/MATLAB' with the following lines 
/usr/local/MATLAB/MATLAB_Runtime/v94/runtime/glnxa64
/usr/local/MATLAB/MATLAB_Runtime/v94/bin/glnxa64
/usr/local/MATLAB/MATLAB_Runtime/v94/sys/os/glnxa64
/usr/local/MATLAB/MATLAB_Runtime/v94/extern/bin/glnxa64

然後執行 ldconfig。

sudo ldconfig

您可能需要取消設置$LD_LIBRARY_PATH變數以使連結器使用正常的系統搜尋路徑並為 MATLAB 拾取新的搜尋路徑。

unset LD_LIBRARY_PATH

我的工作站上有類似的問題。為了解決這個問題,我在這個路徑下創建了一個文件夾/usr/lib/GLops,然後我GL librariesMesa rpms中提取了它並將它們放在那個目錄中。最後,我將以下幾行添加到~.tcshrc

setenv LD_LIBRARY_PATH /usr/lib64/GLops/libGL.so
setenv LIBGL_ALWAYS_SOFTWARE 1
setenv LIBGL_ALWAYS_INDIRECT 1
setenv LIBGL_DIR3_DISABLE 1
setenv MESA_GL_VERSION_OVERRIDE 2.1

該路徑/usr/lib64/GLops/包含以下文件:

libGL.so  libGL.so.1  libGL.so.1.2.0  libxcb.so  libxcb.so.1  libxcb.so.1.1.0

我擁有的庫/usr/lib64/GLops:/usr/lib/GLops

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