我正在尝试链接一个性质非常复杂的程序:
- 在 Linux Fedora 下开发和运行
- 用 fortran 2003 编写的主要代码在很大程度上依赖于 Intel 的 MKL 库和一小段 ANSI C 代码
- 它有 C++ 接口(使用 iso_c_binding)
- 通过 boost.python 从 python 访问 c++ 接口
在运行时我得到以下文本
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 是被链接的模块,那么
导入模块 libFrrBoost 的运行python t83.py
(特别是链接器在准备二进制文件时不会抱怨)会导致错误。
试图谷歌。我发现的所有信息都与用 C/Fortran 编写的“常规程序”有关,其中包括英特尔的 MKL。我能够毫无问题地运行这类程序。我认为 Makefile 中链接行的 MKL 部分在这两种情况下都是等价的,但一定有一个隐藏的谜团。问题通常是错误的链接 - 我认为这不适用(这些库与英特尔手册中的完全一样 - 接口、线程和计算库非常标准)
使用的编译器:
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
:; 结果是(在 grepping 之后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
我知道 open 的规范在这里是特别的,因为 3,4 是肯定的,表明 open 找到了一个文件并为其分配了文件描述符。我已经验证该文件确实存在于那个地方。
这也是“好”的英特尔编译器目录:
czeslaw@stefan:~/prog/FoCpy3 $ which ifort
/opt/intel/composer_xe_2011_sp1.7.256/bin/intel64/ifort
所以版本是一样的——显然这不是版本问题。
一切都是一样的libmkl_def.so
。
免责声明:虽然我听起来对我写的东西很有信心,但我不是。每个句子都应该以“如果我没记错的话”开头。