Ubuntu 16.04のイメージでDockerを使用しています。私はこのドッカーを使用して実行しています:
DockerにMCRをインストールする前に、次を使用してboostをインストールしました。
$ Sudo apt-get install -y libboost-all-dev
そして、C++クラスをラップしてPythonで呼び出すことができました。次に、MCRをインストールしました。要件の1つは、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
それは機能し、MATLABのpythonパッケージをpythonで実行できましたが、LD_LIBRARY_PATH
の変更によりC++クラスラッパーのテストに失敗しました。たとえば、 、PythonでC++クラスをインポートしようとすると、次のエラーが発生します。
/usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0: undefined symbol: XML_SetHashSalt
LD_LIBRARY_PATH
の設定を解除すると、C++インポートは機能しますが、MCRが失敗します。したがって、C++クラスとMatlabのpythonパッケージを正常に実行するために、LD_LIBRARY_PATH
はどうあるべきかという質問ですか?
ライブラリを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
[〜#〜]編集[〜#〜]
LD_LIBRARY_PATH
を設定する前のC++ライブラリファイルの依存関係:
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)
私にとってそれが機能する唯一の方法は、LD_PRELOAD
を定義してシステムライブラリをポイントすることです。だから私の現在の環境は:
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:/usr/local/MATLAB/MATLAB_Runtime/v94/sys/opengl/lib/glnxa64
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libexpat.so
そこで、Dockerで、前述の環境変数を含む.matlab
ファイルを作成しました。次に、dockerfileに以下を追加しました。
services:
Django: &Django
build:
context: .
dockerfile: ./compose/local/Django/Dockerfile
depends_on:
- postgres
volumes:
- .:/app
- shared_upload_tmp:/app_temp
- media:/app/computation_server/media
env_file:
- ./.envs/.local/.Django
- ./.envs/.local/.postgres
- ./.envs/.production/.matlab
ports:
- "8800:8000"
command: /start
次の2つのオプションがあります。
上記の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
このexport
ステートメントは、.bashrc
fyiに追加しない限り、Shellセッションの永続的な部分にはなりません。
/etc/ld.so.conf.d/
にMATLABライブラリパスを追加し、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
リンカが通常のシステム検索パスを使用し、MATLABの新しい検索パスを取得するには、$LD_LIBRARY_PATH
変数の設定を解除する必要がある場合があります。
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