2013-07-14 33 views
10

OSX上の異なるlibjpegダイナミックライブラリ間にダイナミックリンク競合があります。最初に、標準のネイティブlibJPEG.dylib(/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/)があります。しかし、MacPortsを使用している場合、ポート関連のlibjpeg.dylibを(/ opt/local/libに)置くこともできます。後者は、たとえば、他のポートの依存関係としてインストールされている可能性があります。OSXの動的リンクの優先順位の競合ですか?

システム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 
    

    をだから私は(おそらく関連)二つの質問を持っています

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

  2. ダイナミックライブラリでは、他にどのようなパスが検索されていますか(つまり、 "/ System/Library"パスが指定されています)、なぜDYLD_LIBRARY_PATHのランクが高いのですか?

答えて

8

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) 

私の自作内蔵プログラムのひとつの例については:それは/usr/localを参照すること

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

注意。間違ったライブラリを参照するようにビルドした場合は、再構築し、正しいライブラリを参照することをお勧めします。

install_name_toolを使用してどのパスを使用するのかを編集することは可能ですが、新しいパスが古いパスより長く、リンクしていないなどの理由で動作しない場合があります-header_pad_max_install_namesとなります。正しいパスで再構築することをお勧めします。

ライブラリがローダに関連して見つかるようにするためのいくつかの「特別な」パスがあります。 dyld(1)のマニュアルページの@executable_path/とその関連項目を参照してください。

+0

は、返信いただきありがとうございます。 'otool'と' install_name_tool'は本当に便利です。リンクするときにすべてのライブラリにフルパスを使用しない理由は、バイナリがbrewやportsなしのシステムに配布されるためです。私はできるだけ多くのシステムライブラリを使いたいと思っています。残りのライブラリはアプリと共にパッケージ化されます。しかし、開発中にディレクトリ構造はインストールされたアプリケーションとは違って見えるので、システムライブラリ以外のライブラリを相対パスで(配布するバージョンのように)リンクしますが、準備ができるまで/ opt/local /をDYLDに入れますリリース/パッケージング。 – kamjagin

+1

しかし、正しい方法はDYLD_LIBRARY_PATHを避けることです。 – kamjagin

+1

また、特定のツリー構造を必要とするMac用のシステム実行可能ファイルも開発しています。私が使っている解決策は2つあります。Xcodeで 'INSTALL_PATH'、' DSTROOT'、 'DEPLOYMENT_LOCATION'を使って最終的なツリーのようなツリーにインストールします。相対パスに依存するもの( '@ executable_path')でも十分です。絶対パスを必要とするものについては、私の "本当の"インストールパスからXcodeの 'DSTROOT'へのシンボリックリンクがあります。 –

1

私は、同様のエラーを持っていた、と私は私のbash_profileに次の変数を入れて解く:

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

MacOSのエルキャピタンでのOpenCVを使用している間、私は同様の問題を経験しました。

/System/Library/Frameworks/ImageIO.framework/Resources/ソリューションは、/ usr/local/libディレクトリにいくつかのdlylibsを削除し、関連ファイルへのシンボリックリンクを作成することです link

溶液を使用して問題を解決

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 
+1

LIFE SAVING !!!!どうもありがとう。私のシステムでは、削除するlibgif.dylibはありませんでした。 –

+0

うわー。それはうまくいった!どうもありがとう! – Mauker

+0

ありがとう! 'libgifは私のシステム上にあった。 – kilojoules

0

私はmdemirstの指示に従い、問題を修正しました。 OS X Sierraを使用しています。

他の誰かが同じ問題に遭遇した場合に備えて、私はちょっとした要点を作成しました。

Gist to fix Spidermonkey errors

3

あなたがのlibjpeg、libtiffに、MacOSのImageIOでライブラリを使用するようにリンカを混乱させる可能性のlibpngをインストールするために自作を使用する場合はMacOSのシエラ 上のApache Celixを実行しようとしたとき、私は同様のエラーが発生しました。我々がする必要があるたび

brew unlink libpng 
brew unlink libtiff 
brew unlink libjpeg 

それらのLIBSを再リンクされています:簡単な修正はそれらのLIBSを解除され

brew link libpng 
brew link libtiff 
brew link libjpeg 
+0

Qtクリエータを使って作業しているときにこの問題が発生しました。上記は簡単に可逆的な良い解決策です。 libgifに問題がある場合は、 'brew unlink giflib'も必要です。 –

関連する問題