Существует динамический конфликт между различными динамическими библиотеками 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 ранжируется с более высоким приоритетом?
Вы не должны устанавливать пути к библиотекам, используя 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
У меня была похожая ошибка при попытке запустить 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
При использовании Qt Creator
, вы должны снять Add build library search path to DYLD_LIBRARY_PATH and DYLD_FRAMEWORK_PATH
вариант из Run
раздел в Projects
вкладка:
У меня была похожая ошибка, и я решил поместить следующую переменную в мой bash_profile:
export DYLD_LIBRARY_PATH=/usr/lib/:$DYLD_LIBRARY_PATH
Я следовал инструкциям, предложенным mdemirst, и это решило мою проблему. Я использую OS X Sierra.
Я создал суть на тот случай, если кто-то столкнется с той же проблемой.