見出し画像

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に書いておくといいかもしれません。


以下を参考にしました。 https://stackoverflow.com/questions/71010343/cannot-load-swrast-and-iris-drivers-in-fedora-35/72200748#72200748


ちなみに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: 通常ファイルではありません

この記事が気に入ったらサポートをしてみませんか?