2013-04-08

ライブラリが見つからないと言われたので ldd でリンク先を調べてリンクした

先輩からもらったコードを自分のコードにマージしてコンパイルするとなんかエラーが出た。
$ ifort -fast foo.f90
は問題ないのに -fast を外すとエラーになる。どうも -static が必要っぽい。ググると、

relocation truncated to fit: R_X86_64_PC32

がヒット。よく読んでないけど(読んでも意味がわからん)、下の方にあるコメントで "-mcmodel medium -shared-intel" を付けろとあるので付けてみた。
$ ifort -O1 -mcmodel medium -shared-intel foo.f90
するとコンパイルは通った。ただ、実行しようとするとライブラリが見つからないとか言われる。

そこで、こないだ覚えた
$ ldd a.out
をしてみると、
        linux-vdso.so.1 =>  (0x00007fff657f3000)
        libifport.so.5 => not found
        libifcore.so.5 => not found
        libimf.so => not found
        libsvml.so => not found
        libm.so.6 => /lib64/libm.so.6 (0x0000003091400000)
        libintlc.so.5 => not found
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003091000000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003090800000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003092400000)
        libdl.so.2 => /lib64/libdl.so.2 (0x0000003090c00000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003090400000)
という感じになった。ので、
$ su -
して、 not found と言われたもののシンボリックリンクを作った:

# ln -is /opt/intel/lib/intel64/libifport.so.5 /usr/lib64/libifport.so.5
# ln -is /opt/intel/lib/intel64/libifcore.so.5 /usr/lib64/libifcore.so.5
# ln -is /opt/intel/lib/intel64/libimf.so /usr/lib64/libimf.so
# ln -is /opt/intel/lib/intel64/libsvml.so /usr/lib64/libsvml.so
# ln -is /opt/intel/lib/intel64/libintlc.so.5 /usr/lib64/libintlc.so.5
んで再度
$ ldd a.out
すると、ちゃんと全部見つかって、実行できた。ldd 便利。

No comments: