正確設置 LD_LIBRARY_PATH
我正在使用帶有 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_PATH
C++ 導入工作但 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)
你有幾個選擇:
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 libraries
從Mesa 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