Конфликт между приоритетом динамической привязки в OSX?

Существует динамически связанный конфликт между различными динамическими библиотеками libjpeg в OSX. Сначала есть стандартный родной libJPEG.dylib(в/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/). Но если вы используете MacPorts, у вас также может быть связанный с портом libjpeg.dylib(in/opt/local/lib). Последнее может быть, например, установлено как зависимость для другого порта.

Это создает проблему, если вы ссылаетесь на вашу систему libJPEG (что предпочтительнее). Тогда, если /opt/local/lib находится в DYLD_LIBRARY_PATH, этот путь будет приоритетным при поиске динамического lib, что приведет к ошибке выполнения при загрузке символов:

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, очевидно, решает его, но создает проблемы для других зависимостей)?

  • Какие еще пути ищутся для динамических библиотек (I.e. Где указан путь "/System/Library" ) и почему DYLD_LIBRARY_PATH занимает более высокий приоритет?

Ответ 1

Нельзя устанавливать пути библиотеки с помощью 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).

Ответ 2

У меня возникла аналогичная проблема при использовании OpenCV в MacOS El Capitan. Решена проблема с использованием решения в ссылка

Решение состоит в том, чтобы удалить некоторые dlylib в каталоге /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

Ответ 3

У меня была аналогичная ошибка при попытке запустить 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

Ответ 4

У меня была аналогичная ошибка, и я решил поместить следующую переменную в мой bash_profile:

export DYLD_LIBRARY_PATH=/usr/lib/:$DYLD_LIBRARY_PATH

Ответ 5

Я следовал инструкциям, которые были предложены, и он исправил мою проблему. Я использую OS X Sierra.

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

Gist для исправления ошибок Spidermonkey