web-dev-qa-db-ja.com

OSXでのダイナミックリンクの優先順位間の競合?

OSX上の異なるlibjpegダイナミックライブラリ間にダイナミックリンクの競合があります。まず、標準のネイティブ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

だから私は2つの質問があります(おそらく関連しています):

  1. 実際の問題を解決する良い方法は何ですか(/opt/local/libからDYLD_LIBRARY_PATHを削除すると、明らかに問題は解決しますが、他の依存関係の問題が発生します)。

  2. 動的ライブラリを検索する他のパス(つまり、「/ System/Library」パスが指定されている場所)と、DYLD_LIBRARY_PATHの優先順位が高いのはなぜですか?

15
kamjagin

_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)
_

私の自作のプログラムの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_で。正しいパスで再構築することをお勧めします。

ローダーに関連してライブラリを見つけることができる「特別な」パスがいくつかあることに注意してください。 dyld(1)のマニュアルページの_@executable_path/_とその親族を参照してください。

9
Rob Napier

MacOS El CapitanでOpenCVを使用しているときに、同様の問題が発生しました。 link のソリューションを使用して問題を解決しました

解決策は、/ usr/local/libディレクトリ内のいくつかのdlylibを削除し、関連ファイル/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
mdemirst

MacOSSierraでApacheCelixを実行しようとすると、同様のエラーが発生しました。Homebrewを使用してlibjpeg、libtiff、libpngをインストールすると、リンカーがmacOSimageIOライブラリを使用するのを混乱させる可能性があります。簡単な修正はnlinkそれらのライブラリです:

brew unlink libpng
brew unlink libtiff
brew unlink libjpeg

必要なときはいつでも、これらのライブラリを再リンクします。

brew link libpng
brew link libtiff
brew link libjpeg
7
Thien Pham

Qt Creatorを使用する場合は、RunタブのProjectsセクションからAdd build library search path to DYLD_LIBRARY_PATH and DYLD_FRAMEWORK_PATHオプションのチェックを外す必要があります。

qtcreator

6
Iulian Onofrei

同様のエラーが発生し、bash_profileに次の変数を配置することで解決しました。

export DYLD_LIBRARY_PATH=/usr/lib/:$DYLD_LIBRARY_PATH
2
Franzé Jr.

Mdemirstが提案した指示に従い、問題が修正されました。 OS XSierraを使用しています。

他の誰かが同じ問題に遭遇した場合に備えて、Gistを作成しました。

スパイダーモンキーエラーを修正するための要点

0
Chris Wessells