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つの質問があります(おそらく関連しています):
実際の問題を解決する良い方法は何ですか(/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)
_
私の自作のプログラムの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/
_とその親族を参照してください。
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
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
Qt Creator
を使用する場合は、Run
タブのProjects
セクションからAdd build library search path to DYLD_LIBRARY_PATH and DYLD_FRAMEWORK_PATH
オプションのチェックを外す必要があります。
同様のエラーが発生し、bash_profileに次の変数を配置することで解決しました。
export DYLD_LIBRARY_PATH=/usr/lib/:$DYLD_LIBRARY_PATH
Mdemirstが提案した指示に従い、問題が修正されました。 OS XSierraを使用しています。
他の誰かが同じ問題に遭遇した場合に備えて、Gistを作成しました。