LD_LIBRARY_PATHのエラー
freesurferにはsegmentThalamicNuclei.shという視床をsubregionに分割してくれるプログラムがあります。久しぶりにこれを実行しようとしたところ、以下のようなエラーになりました。
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
libGL error: MESA-LOADER: failed to open iris: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません
libGL error: MESA-LOADER: failed to open swrast: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
ググってみると原因はlibstdc++.so.6というファイルを見つけられないことだそうです。なので、LD_LIBRARY_PATHというLinuxがライブラリを探すPATHにこのファイルを付け加えます。 まず以下でどこにこのライブラリがあるか見つけます。
find / -name libstdc++.so.6 2>/dev/null
MATLABとかFSLとかいろんなところに入っていますが、本来のライブラリのPATHを見つけます。私の場合は以下にありました。
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
これを強制的にLD_LIBRARY_PATHに付け加えるには、LD_PRELOADという環境変数を使います。
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
これでエラーは解消されました。
実は以前にも全くおなじことをやっていたので(完全に忘れていてもう一度調べました)、私のような忘れっぽい人は上記を.bashrcか.bash_aliasesに書いておくといいかもしれません。
ちなみにlddというコマンドを使うと「動的」実行ファイルにリンクされるライブラリを調べることができます。(「動的」の意味はこちらがわかりやすかったです)
調べたいコマンドをフルパスで指定してみると、
$ ldd /bin/ls
linux-vdso.so.1 (0x00007ffd24390000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007473292ab000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000747329000000)
libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x0000747328f69000)
/lib64/ld-linux-x86-64.so.2 (0x0000747329320000)
とか、
$ ldd $FSLDIR/bin/fslmaths
linux-vdso.so.1 (0x00007fff7c98e000)
libfsl-newimage.so => /usr/local/fsl/bin/../lib/libfsl-newimage.so (0x0000760b36d63000)
libfsl-miscmaths.so => /usr/local/fsl/bin/../lib/libfsl-miscmaths.so (0x0000760b36bb0000)
libfsl-cprob.so => /usr/local/fsl/bin/../lib/libfsl-cprob.so (0x0000760b36ba6000)
liblapack.so.3 => /usr/local/fsl/bin/../lib/liblapack.so.3 (0x0000760b34ad0000)
libstdc++.so.6 => /usr/local/fsl/bin/../lib/libstdc++.so.6 (0x0000760b348ed000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x0000760b347e1000)
libgcc_s.so.1 => /usr/local/fsl/bin/../lib/libgcc_s.so.1 (0x0000760b347c6000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000760b34400000)
libfsl-NewNifti.so => /usr/local/fsl/bin/../lib/libfsl-NewNifti.so (0x0000760b347a9000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x0000760b347a4000)
libfsl-utils.so => /usr/local/fsl/bin/../lib/libfsl-utils.so (0x0000760b3478a000)
libgfortran.so.5 => /usr/local/fsl/bin/../lib/./libgfortran.so.5 (0x0000760b34255000)
libgomp.so.1 => /usr/local/fsl/bin/../lib/./libgomp.so.1 (0x0000760b34688000)
/lib64/ld-linux-x86-64.so.2 (0x0000760b36f9e000)
libfsl-znz.so => /usr/local/fsl/bin/../lib/libfsl-znz.so (0x0000760b34682000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x0000760b3467d000)
libquadmath.so.0 => /usr/local/fsl/bin/../lib/././libquadmath.so.0 (0x0000760b34642000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x0000760b3463d000)
libz.so.1 => /usr/local/fsl/bin/../lib/libz.so.1 (0x0000760b3423a000)
とかのように表示されます。
ただしsegmentThalamicNuclei.shの本体はMATLABランタイムなので、こちらでは表示できません。
ldd: /usr/local/freesurfer/7.4.1/MCRv97: 通常ファイルではありません