Ссылка на динамическую библиотеку на Mac с полным путем

Я связываю библиотеку (расширение Python), в которую встроен движок Matlab, со следующей командой (сгенерированной с помощью 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

в результате чего

$ 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)

Однако, когда я пытаюсь использовать библиотеку, я получаю сообщение об ошибке:

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

Я считаю, что проблема связана с тем, что компоновщик включает файлы dylib Matlab в форме @loader_path/libeng.dylib, а не использует полный путь, хотя я указываю полный путь к g++. Как я могу заставить компоновщик использовать полный путь?

Я знаю, что одно решение - использовать

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

где находятся эти файлы библиотеки, но я бы хотел избежать этого, поскольку это вызывает некоторые другие проблемы.


person D R    schedule 20.12.2009    source источник
comment
Пожалуйста, обратитесь к моему ответу по этой ссылке [Add_libray][1] [1]: stackoverflow.com/questions/4876740/   -  person itechnician    schedule 08.10.2013


Ответы (4)


Изменение файлов вручную с помощью 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 

Я мог бы использовать это как временное исправление, но мне интересно, нет ли лучшего решения, когда компоновщику предоставляется настройка для использования полных путей.

person D R    schedule 20.12.2009
comment
это полезно, но вы правы, в CMake должен быть способ сделать это - person eqzx; 07.03.2013
comment
В итоге мне пришлось выполнить обратную операцию; замена абсолютного пути на тот, который включает @loader_path. справочная страница dyld помог объяснить поведение dyld в отношении абсолютных путей и раскрытия @loader_path. - person nornagon; 07.01.2016

Обратите внимание, что некоторые проблемы с DYLD_LIBRARY_PATH можно предотвратить, используя вместо них DYLD_FALLBACK_LIBRARY_PATH. Это будет использоваться только в том случае, если библиотека не может быть найдена в путях по умолчанию.

person quazgar    schedule 07.06.2011
comment
Использование этого просто сломало оболочку, в которой я был, и дало мне: ``` python dyld: библиотека не загружена: @loader_path/../lib/libpython2.7.dylib Ссылка на: .../bin/python Причина: изображение не найдено Trace/BPT trap: 5 ``` - person Chris Withers; 24.12.2015

Посмотрите параметр -rpath команды ld, чтобы управлять этим. Вас также может заинтересовать содержимое https://github.com/bimargulies/jni-origin-testbed, который представляет собой демонстрацию некоторых соответствующих технологий.

Критическая техника здесь такова:

install_name_tool -change libsl2.so "@loader_path/libsl2.so" libsl1.so
person bmargulies    schedule 20.12.2009
comment
Не могли бы вы рассказать об этом немного подробнее? У меня такая же проблема. Я чувствую, что некоторые пути в моем построенном проекте не смотрят в нужное место! - person Yasin; 19.07.2015

Вы также можете использовать символическую ссылку!

person JM Marino    schedule 14.08.2010