Конфликт между приоритетами динамической компоновки в OSX?
Существует динамический конфликт между различными динамическими библиотеками libjpeg в OSX. Сначала есть стандартный родной libJPEG.dylib (в /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/). Но если вы используете MacPorts, у вас также может быть файл libjpeg.dylib, связанный с портом (в /opt/local/lib). Последний, например, может быть установлен как зависимость для какого-либо другого порта.
Это создает проблему, когда вы ссылаетесь на вашу систему libJPEG (что является предпочтительным). Тогда если /opt/local/lib
находится в DYLD_LIBRARY_PATH, этот путь будет иметь приоритет при поиске динамической библиотеки, что приведет к ошибке времени выполнения при загрузке символов:
dyld: Symbol not found: __cg_jpeg_resync_to_restart
Referenced from:
/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
Expected in: /opt/local/lib/libJPEG.dylib
in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
Trace/BPT trap: 5
Итак, у меня есть два вопроса (вероятно, связанных):
Что является хорошим способом решения актуальной проблемы (удаление
/opt/local/lib
отDYLD_LIBRARY_PATH
очевидно решает это, но создает проблемы для других зависимостей)?Какие другие пути ищутся для динамических библиотек (т. Е. Где указан путь "/System/Library") и почему DYLD_LIBRARY_PATH ранжируется с более высоким приоритетом?
6 ответов
Вы не должны устанавливать пути к библиотекам, используя DYLD_LIBRARY_PATH
, Как вы обнаружили, это имеет тенденцию взрываться. Исполняемые файлы и библиотеки должны иметь встроенные в них требования к библиотекам во время компоновки. использование otool -L
чтобы узнать, что ищет файл:
$ otool -L /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO:
/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO (compatibility version 1.0.0, current version 1.0.0)
...
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
Для примера одной из моих доморощенных программ:
$ otool -L /usr/local/bin/gifcolor
/usr/local/bin/gifcolor:
/usr/local/Cellar/giflib/4.1.6/lib/libgif.4.dylib (compatibility version 6.0.0, current version 6.6.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
Обратите внимание, что это ссылки /usr/local
, Если вы создали его так, что он ссылается на неправильную библиотеку, я рекомендую перестроить и указать правильную библиотеку.
Если это невозможно, можно редактировать, какой путь используется install_name_tool
, но есть случаи, когда это не работает, например, если новый путь длиннее старого и вы не связали его с -header_pad_max_install_names
, Восстановление с правильным путем является предпочтительным.
Обратите внимание, что есть несколько "специальных" путей, которые позволяют найти библиотеки относительно их загрузчика. Увидеть @executable_path/
и его родственник в dyld(1)
справочная страница.
Я столкнулся с подобной проблемой при использовании OpenCV в MacOS El Capitan. Решил проблему, используя решение по ссылке
Решение состоит в том, чтобы удалить некоторые dlilibs в каталоге / usr / local / lib и создать символические ссылки на связанные файлы /System/Library/Frameworks/ImageIO.framework/Resources/
cd /usr/local/lib
rm libgif.dylib
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libGIF.dylib libGIF.dylib
rm libjpeg.dylib
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libJPEG.dylib libJPEG.dylib
rm libtiff.dylib
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libTIFF.dylib libTIFF.dylib
rm libpng.dylib
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libPng.dylib libPng.dylib
При использовании Qt Creator
, вы должны снять Add build library search path to DYLD_LIBRARY_PATH and DYLD_FRAMEWORK_PATH
вариант из Run
раздел в Projects
вкладка:
У меня была похожая ошибка при попытке запустить Apache Celix на macOS Sierra. Если вы используете Homebrew для установки libjpeg, libtiff, libpng, что может запутать компоновщик при использовании библиотеки macOS imageIO. Простое исправление - это отсоединение этих библиотек:
brew unlink libpng
brew unlink libtiff
brew unlink libjpeg
Повторно связывайте эти библиотеки всякий раз, когда нам нужно:
brew link libpng
brew link libtiff
brew link libjpeg
У меня была похожая ошибка, и я решил поместить следующую переменную в мой bash_profile:
export DYLD_LIBRARY_PATH=/usr/lib/:$DYLD_LIBRARY_PATH
Я следовал инструкциям, предложенным mdemirst, и это решило мою проблему. Я использую OS X Sierra.
Я создал суть на тот случай, если кто-то столкнется с той же проблемой.