はじめに
私は現在、高エネルギー物理学や放射線治療などのシミュレーションに使われるGeant4というtool kitを使っているのですが、プログラム実行時に動的ライブラリに関するエラーが出てしまったのでその解決法を書いていきます。
#エラー文
dyld: lazy symbol binding failed: Symbol not found: __ZN18G4OpenGLImmediateXC1Ev
Referenced from: ~/Geant4Tutorial/UserWorkDir/P06/TestBench/../bin/Application_Main
Expected in: /usr/local/lib/libG4OpenGL.dylib
dyld: Symbol not found: __ZN18G4OpenGLImmediateXC1Ev
Referenced from: ~/Geant4Tutorial/UserWorkDir/P06/TestBench/../bin/Application_Main
Expected in: /usr/local/lib/libG4OpenGL.dylib
このエラー文には「シンボルが見つかりません。/usr/local/lib/libG4OpenGL.dylibに欲しいライブラリがありますよ。」的なことが書いてあります。つまりプログラム実行中に欲しいライブラリのパスが通ってないということになります。
#dylibとは
.dylibがついているファイルは動的ライブラリ(dynamic library)と呼ばれるもので、プログラム実行中にリンクするライブラリのことです。Windowsでは.dll、Linuxでは.so、OSXだと.dylibが拡張子として付くそうです。
つまりエラー文は動的ライブラリのパスを通せと言い換えることができます。
動的ライブラリの作り方や使い方はこのサイトにわかりやすく書いてありました。
#解決法1
.bash_profileや.zprofileなどの環境設定ファイルに動的ライブラリがある場所の検索パスを通します。
export DYLD_LIBRARY_PATH=/usr/local/geant4/install/geant4.10.05.p01/lib
そのあとに追加した環境変数をsource
コマンドで反映させます。
$ source ~/.bash_profile
これでエラー文は出なくなり、無事プログラムを実行することができました。
#解決法2
rpathと呼ばれる、プログラム実行中に参照する動的ライブラリの検索パスのリストがあります。
以下のコマンドでrpathに直接ライブラリを追加することができます。
$ install_name_tool -id "@rpath/libG4OpenGL.dylib" libG4OpenGL.dylib