Конфликт между приоритетами динамической компоновки в 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

Итак, у меня есть два вопроса (вероятно, связанных):

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

  2. Какие другие пути ищутся для динамических библиотек (т. Е. Где указан путь «/ System / Library») и почему DYLD_LIBRARY_PATH ранжируется с более высоким приоритетом?

14

Решение

Вы не должны устанавливать пути к библиотекам, используя 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) справочная страница.

9

Другие решения

Я столкнулся с подобной проблемой при использовании 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
32

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

При использовании Qt Creator, вы должны снять Add build library search path to DYLD_LIBRARY_PATH and DYLD_FRAMEWORK_PATH вариант из Run раздел в Projects вкладка:

QtCreator

4

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

export DYLD_LIBRARY_PATH=/usr/lib/:$DYLD_LIBRARY_PATH
1

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

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

Gist, чтобы исправить ошибки Spidermonkey

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector