週末はいつも晴れ

社会人3年目の日記です。プログラミングとか旅行とかラーメン。

MacのGeant4でlibjpegなどの画像ライブラリまわりでdyldエラーが出るとき

homebrewでlibjpeg, libtiff, libpngをインストールしていると、エラーが出ます。
gnuplotをインストールする際にDependenciesとして必須な画像ライブラリなので、インストールしている方がほとんどだと思います。

ちなみにこのようなエラーが出ます。

dyld: Symbol not found: __cg_jpeg_resync_to_restart
  Referenced from: /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
  Expected in: /usr/local/lib/libJPEG.dylib
 in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
Trace/BPT trap: 5

Geant4はMacにデフォルトで入っているlijpegを読みに行こうとします。
しかし、ダイナミックリンクライブラリのパスの順序のせいで、/usr/local/libを先に読み込むようになっているために、homebrewでインストールしたlibjpeg.dylibを先に読み込んでしまっているのです。

解決するには、DYLD_LIBRARY_PATHを上書きして、Macのlibjpegを先に読み込むようにしてしまうのが簡単です。

僕は普段読み込んでいるgeant4.shの中を書き換えてしまいました。
デフォルトの設定ならば、geant4.shは以下にあります。

/usr/local/bin/geant4.sh

エディターで開いて編集します。

sudo emacs -nw /usr/local/bin/geant4.sh

47行目から51行目あたり(Geant4.10.1の場合)

if test "x$DYLD_LIBRARY_PATH" = "x" ; then
  export DYLD_LIBRARY_PATH="`cd $geant4_envbindir/../lib > /dev/null ; pwd`"
else
  export DYLD_LIBRARY_PATH="`cd $geant4_envbindir/../lib > /dev/null ; pwd`":${DYLD_LIBRARY_PATH}
fi

ここの後ろに上書きする(というか付け加える)行を追加します。

if test "x$DYLD_LIBRARY_PATH" = "x" ; then
  export DYLD_LIBRARY_PATH="`cd $geant4_envbindir/../lib > /dev/null ; pwd`"
else
  export DYLD_LIBRARY_PATH="`cd $geant4_envbindir/../lib > /dev/null ; pwd`":${DYLD_LIBRARY_PATH}
fi

# Added for Mac OS X libjpeg libpng libtiff
export DYLD_LIBRARY_PATH=/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources:$DYLD_LIBRARY_PATH 

これでエラーは消えますし、gnuplotも問題なく使えます。

もしかしたら、追加するPATHはMacのversionによって違うかもしれません。
必要なPATHを検索するコマンド:

sudo find / -name "libJPEG.dylib"