Łączenie z biblioteką dynamiczną na komputerze Mac z pełną ścieżką

Linkuję bibliotekę (rozszerzenie Pythona), która osadza Silnik Matlab za pomocą następującego polecenia (wygenerowanego za pomocą cmake)

c++ -mmacosx-version-min=10.6 -bundle -headerpad_max_install_names  -o library.so library.o /Applications/MATLAB_R2009b.app/bin/maci64/libeng.dylib /Applications/MATLAB_R2009b.app/bin/maci64/libmx.dylib -framework Python

W wyniku

$ otool -L library.so
library.so:
    @loader_path/libeng.dylib (compatibility version 0.0.0, current version 0.0.0)
    @loader_path/libmx.dylib (compatibility version 0.0.0, current version 0.0.0)
    /System/Library/Frameworks/Python.framework/Versions/2.6/Python (compatibility version 2.6.0, current version 2.6.1)
    /opt/local/lib/gcc44/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.13.0)
    /opt/local/lib/gcc44/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.0)

Jednak, gdy próbuję korzystać z biblioteki, pojawia się komunikat o błędzie:

ImportError: dlopen(./library.so, 2): Library not loaded: @loader_path/libmex.dylib
  Referenced from: ./library.so
  Reason: image not found

Uważam, że problem wynika z faktu, że linker zawiera pliki matlab dylib w postaci @loader_path/libeng.dylib zamiast używać pełnej ścieżki, mimo że podaję pełną ścieżkę g++. Jak mogę zmusić linkera do korzystania z pełnej / align = "left" /

Wiem, że jednym z rozwiązań jest użycie

export DYLD_LIBRARY_PATH=/Applications/MATLAB_R2009b.app/bin/maci64:$DYLD_LIBRARY_PATH

Gdzie znajdują się te pliki biblioteczne, ale chciałbym tego uniknąć, ponieważ powoduje to inne problemy.

Author: dzhelil, 2009-12-21

4 answers

Ręczna zmiana plików za pomocą install_name_tool

install_name_tool -change "@loader_path/libeng.dylib" "/Applications/MATLAB_R2009b.app/bin/maci64/libeng.dylib" library.so 
install_name_tool -change "@loader_path/libmx.dylib" "/Applications/MATLAB_R2009b.app/bin/maci64/libmx.dylib" library.so 

Mógłbym użyć tego jako tymczasowej poprawki, ale zastanawiam się, czy nie ma lepszego rozwiązania, w którym linker ma ustawienie do korzystania z pełnych ścieżek.

 29
Author: dzhelil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-20 22:33:35

Zauważ, że niektóre problemy z DYLD_LIBRARY_PATH można zapobiec za pomocą DYLD_FALLBACK_LIBRARY_PATH. Zostanie to użyte tylko wtedy, gdy lib nie może zostać znaleziony w ścieżkach domyślnych.

 7
Author: quazgar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-07 11:11:15

Zajrzyj do opcji-rpath polecenia ld, aby to kontrolować. Możesz być również zainteresowany zawartością https://github.com/bimargulies/jni-origin-testbed , który jest demonstracją jakiejś istotnej technologii.

Krytyczna technika jest tutaj:

install_name_tool -change libsl2.so "@loader_path/libsl2.so" libsl1.so
 5
Author: bmargulies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-19 16:55:49

Możesz również użyć dowiązania symbolicznego !

 -2
Author: JM Marino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-14 17:11:37