Компоновщик времени выполнения OS X, находящий неправильную версию lib - PullRequest
3 голосов
/ 26 февраля 2011

У меня есть общая библиотека C ++, вызываемая из моей программы на Python. C ++ lib скомпилирован с HDF5, который я установил с помощью homebrew на OS X, поэтому он находится в /usr/local/lib. Теперь проблема в том, что у меня также установлены PyTables, который включает в себя более старую версию libhdf5, установленную где-то в /Library/Frameworks/EPD64.framework/Versions/Current/...

Я могу прекрасно скомпилировать и связать свою библиотеку, и otool -L действительно указывает на /usr/local/lib/libhdf5.dylib. Однако, когда я пытаюсь запустить его из Python, возникает ошибка несоответствия версий. Каким-то образом компоновщик времени выполнения загружает старую библиотеку hdf5.

Один из обходных путей - вместо этого создать hdf5 как статическую библиотеку, но я бы хотел найти более подходящее решение - как я могу убедить компоновщик среды выполнения использовать более новую библиотеку? Я уже пытался установить DYLD_LIBRARY_PATH, но это просто сломало все остальное (Python и MacVim не запускались).

1 Ответ

0 голосов
/ 22 марта 2011

Можете ли вы предоставить больше информации?У меня есть несколько альтернатив (и вопросов).

Если я правильно понял, у вас есть библиотека, которая использует lib_ver_a.dyld и pyTables, которая использует lib_ver_b.dyld.Т.е. та же библиотека, но другая версия.

Вы можете либо:

  1. скомпилировать свою библиотеку, чтобы использовать ту же версию, что и pyTables (DYLD_LIB ... во время компиляции), изапустите вашу программу с библиотекой pyTables: DYLD_LIBRARY_PATH = / correct / path / lib python myprog.py

  2. Обновите ваш xcode (какая версия у вас есть? также какая версия osx?).Это обновляет ваши библиотеки и таблицы PyTable (будьте осторожны, новейшая версия не обязательна, самая стабильная)

Вы также должны проверить, какой Python вы вызываете (пользовательский или яблочный).

Существует также возможность определить конкретный dyld при компоновке (вы используете gcc или ld для компоновки? Я мог бы пропустить некоторые опции здесь):

gcc /path/lib1.dyld myLib.c -o myLib.o

Таким образом, ваша библиотека связана с определенной версией библиотеки (осторожно! Я не помню точные детали, но могу их выкопать).

Надеюсь, это поможет.

br,

Юха

...