web-dev-qa-db-fra.com

Définir LD_LIBRARY_PATH correctement

J'utilise Docker avec l'image d'Ubuntu 16.04. J'utilise ce menu fixe pour exécuter:

  • Importer des classes C++ dans python à l'aide de boost.python
  • Importez le package python de matlab dans python avec l'aide de Matlab Runtime (MCR).

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)
5
Coderji

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
0
Coderji

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.

2
WinEunuuchs2Unix

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

1
mbeyss