Set LD_LIBRARY_PATH correctly
Solution 1
The only way it worked for me is by defining LD_PRELOAD
and point it to system library. So my current environment would be:
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
So in docker, I have created a .matlab
file that contains the mentioned env variables. Then, in dockerfile I added the following:
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
Solution 2
This Stack Exchange Q&A has various ways of setting LD_LIBRARY_PATH
the top voted answer suggests this is the best way:
sudo -H gedit /etc/ld.so.conf.d/randomLibs.conf
inside the file you are supposed to write the complete path to the directory that contains all the libraries that you wish to add to the system, for example
/home/linux/myLocalLibs
remember to add only the path to the dir, not the full path for the file, all the libs inside that path will be automatically indexed.
Save and run sudo ldconfig
to update the system with this libs.
Solution 3
Do you have to export the LD_LIBRARY_PATH? can't you just preface the matlab call with it, e.g.
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/...
(I do not exactly know what the executable is called like)
You could put that in a little skript
Secondly, it could be possible to change the rpath of the executable or some library, so it looks at the correct place directly. I use patchelf for this
patchelf --set-rpath
Since there are multiple paths involved it could get a bit tricky, though
Related videos on Youtube
Coderji
Working as a full stack Machine Learning Engineer in COMPREDICT GmbH. Passionate about ML, Web and Android development.
Updated on September 18, 2022Comments
-
Coderji over 1 year
I am using Docker with image of Ubuntu 16.04. I am using this docker to run:
- Import C++ classes in python with the help of boost.python
- Import matlab's python package in python with the help Matlab Runtime (MCR).
Before I have installed MCR in the docker, I have installed boost using:
$ sudo apt-get install -y libboost-all-dev
and I was able to wrap C++ classes and call them in python. Then I have installed MCR and one of the requirement is to set
LD_LIBRARY_PATH
to Matlab's library.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
It worked, I was able to run matlab's python package in python but testing the C++ classes wrappers failed due to change of
LD_LIBRARY_PATH
. For example, I get the following error when I try to import C++ class in python:/usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0: undefined symbol: XML_SetHashSalt
If I unset
LD_LIBRARY_PATH
C++ import works but MCR fails. So the question whatLD_LIBRARY_PATH
should be in order to run both C++ classes and Matlab's python package successfully?I have tried to add path to boost libraries to
LD_LIBRARY_PATH
but didn't work, so the env value would be:/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
the dependencies of C++ library file before setting the
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)
After setting
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)
-
Coderji over 5 yearsThanks for your answer, the preface didn't work with me.. I am trying to do the patchelf but it seems complicated. And in the future I might have many C++ classes.. wouldn't this mean that I will need to do it for all of them?
-
mbeyss over 5 yearsyou would have to do this for every executable / shared library. But If you compile them yourself you must be able to set this at compile time ( or link time to be precise)