J'utilise Docker avec l'image d'Ubuntu 16.04. J'utilise ce menu fixe pour exécuter:
Avant d’installer MCR dans le menu fixe, j’ai installé boost en utilisant:
$ Sudo apt-get install -y libboost-all-dev
et j'ai pu envelopper des classes C++ et les appeler en python. Ensuite, j'ai installé MCR et l'une des conditions requises consiste à définir LD_LIBRARY_PATH
dans la bibliothèque de 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
Cela a fonctionné. J'ai pu exécuter le package python de matlab dans python, mais le test des enveloppeurs de classes C++ a échoué en raison de la modification de LD_LIBRARY_PATH
. Par exemple, le message d'erreur suivant s'affiche lorsque j'essaie d'importer une classe C++ en python:
/usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0: undefined symbol: XML_SetHashSalt
Si je désactive LD_LIBRARY_PATH
, l’importation C++ fonctionne mais MCR échoue. Donc, la question de ce que LD_LIBRARY_PATH
devrait être pour pouvoir exécuter les classes C++ et le package python de Matlab avec succès?
J'ai essayé d'ajouter un chemin pour booster les bibliothèques à LD_LIBRARY_PATH
mais ne fonctionnant pas, la valeur env serait donc:
/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
EDIT
les dépendances du fichier de bibliothèque C++ avant de définir le 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)
Après avoir défini 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)
La seule façon dont cela a fonctionné pour moi est de définir LD_PRELOAD
et de le diriger vers la bibliothèque système. Donc, mon environnement actuel serait:
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
Donc, dans docker, j'ai créé un fichier .matlab
qui contient les variables env mentionnées. Ensuite, dans dockerfile, j'ai ajouté ce qui suit:
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
Cette Stack Exchange Q & A dispose de plusieurs façons de définir LD_LIBRARY_PATH
.
Sudo -H gedit /etc/ld.so.conf.d/randomLibs.conf
dans le fichier, vous êtes censé écrire le chemin complet du répertoire qui contient toutes les bibliothèques que vous souhaitez ajouter au système, par exemple
/home/linux/myLocalLibs
n'oubliez pas d'ajouter uniquement le chemin du répertoire, pas le chemin complet du fichier, toutes les bibliothèques à l'intérieur de ce chemin seront automatiquement indexées.
Enregistrez et exécutez Sudo ldconfig
pour mettre à jour le système avec cette bibliothèque.
Devez-vous exporter le fichier LD_LIBRARY_PATH? ne pouvez-vous pas simplement préfacer l'appel matlab, par exemple.
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 /usr/local/MATLAB/MATLAB_Runtime/...
(Je ne sais pas exactement comment s'appelle l'exécutable)
Vous pouvez mettre ça dans un petit skript
Deuxièmement, il pourrait être possible de changer le rpath de l'exécutable ou d'une bibliothèque, afin qu'il regarde directement le bon endroit. J'utilise patchelf pour cela
patchelf --set-rpath
Comme il y a plusieurs chemins impliqués, cela pourrait être un peu compliqué, bien que