性質がかなり複雑なプログラムをリンクしようとしています:
- Linux Fedora で開発および実行
- fortran 2003 で書かれたメイン コードは、Intel の MKL ライブラリと ANSI C コードの一部に大きく依存しています。
- C++ インターフェイスがあります (iso_c_binding を使用)
- c++ インターフェイスは、boost.python を介して Python からアクセスされます。
実行時に次のテキストを取得します
MKL FATAL ERROR: Cannot load neither libmkl_avx.so nor libmkl_def.so
その後、プログラムは停止します。
libmkl_avx.so
との両方が入っていることを確認しlibmkl_def.so
ました$LD_LIBRARY_PATH
最終的なリンクは次の方法で行われます。
g++ -g3 -shared -Wl,-soname,libFrrBoost_rt.so interfejs.o t83.o gen_random2.o
-L/opt/intel/composerxe/mkl/lib/intel64 -lpython2.7 -lifport -lifcore -lboost_python
-Wl,--start-group -lmkl_sequential -lmkl_intel_lp64 -lmkl_core -Wl,--end-group
-o libFrrBoost_rt.so
libFrrBoost はリンクされているモジュールです。
python t83.py
モジュールlibFrrBoostをインポートする実行中(特に、バイナリファイルを準備するときにリンカは文句を言いません)はエラーを引き起こします。
ググってみた。私が見つけたすべての情報は、C/Fortran で書かれ、単に Intel の MKL を含む「通常のプログラム」に関連していました。この種のプログラムを問題なく実行できます。Makefile のリンク行の MKL 部分はどちらの場合も同じだと思いますが、どこかに謎が隠されているに違いありません。問題は通常、不適切なリンクでした-これは適切ではありません(ライブラリはIntelのマニュアルとまったく同じです-インターフェイス、スレッド化、および計算ライブラリはかなり標準的です)
使用したコンパイラ:
ifort 12.1.0、icpc 12.1.0、python Python 2.7.1、icc 12.1.0 (小さな C スニペットも MKL を呼び出しますが)
編集(Hirsto Ilievのコメントによる)
この方法で strace を実行しましたstrace python t83.py
。結果は(grep後libmkl
:
open("/opt/intel/composer_xe_2011_sp1.7.256/mkl/lib/intel64/libmkl_avx.so", O_RDONLY) = 3
open("/usr/bin/libmkl_avx.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/opt/slurm-2.2.5/lib/libmkl_avx.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/opt/intel/composer_xe_2011_sp1.7.256/compiler/lib/intel64/libmkl_avx.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/opt/intel/composer_xe_2011_sp1.7.256/debugger/lib/intel64/libmkl_avx.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/opt/intel/composer_xe_2011_sp1.7.256/mkl/lib/intel64/libmkl_avx.so", O_RDONLY) = 3
特に 3,4 は正であり、open がファイルを見つけ、それにファイル ディスクリプタを割り当てたことを示します。ファイルがその場所に存在することを確認しました。
また、これは次のような「適切な」Intel コンパイラ ディレクトリです。
czeslaw@stefan:~/prog/FoCpy3 $ which ifort
/opt/intel/composer_xe_2011_sp1.7.256/bin/intel64/ifort
したがって、バージョンは同じです-明らかに、バージョンの問題ではありません。
についてはすべて同じですlibmkl_def.so
。
免責事項:私は自分が書いたものに自信を持っているように聞こえるかもしれませんが、そうではありません. すべての文は「もし私が間違っていなければ」で始めるべきです。