Соединение с динамической библиотекой по 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

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

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

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

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

20
задан dzhelil 20 December 2009 в 22:05
поделиться

3 ответа

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

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

30
ответ дан 29 November 2019 в 23:52
поделиться

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

Важнейший метод здесь:

install_name_tool -change libsl2.so "@loader_path/libsl2.so" libsl1.so
5
ответ дан 29 November 2019 в 23:52
поделиться

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

-2
ответ дан 29 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: