C++ 链接英特尔&x27;在Python-C++-C-Fortran 2003程序

C++ 链接英特尔&x27;在Python-C++-C-Fortran 2003程序,c++,python,boost,fortran,intel-mkl,C++,Python,Boost,Fortran,Intel Mkl,我试图链接一个性质相当复杂的程序: 在Linux Fedora下开发和运行 用fortran 2003编写的主代码在很大程度上依赖于Intel的MKL库和少量ANSI C代码 具有C++接口(使用ISO-CXBIN) 通过Posith.Python 从Python访问C++接口 在运行期间,我得到以下文本 MKL FATAL ERROR: Cannot load neither libmkl_avx.so nor libmkl_def.so 之后程序停止 我已经检查了libmkl_avx.

我试图链接一个性质相当复杂的程序:

  • 在Linux Fedora下开发和运行
  • 用fortran 2003编写的主代码在很大程度上依赖于Intel的MKL库和少量ANSI C代码
  • 具有C++接口(使用ISO-CXBIN)
  • 通过Posith.Python
  • 从Python访问C++接口
在运行期间,我得到以下文本

MKL FATAL ERROR: Cannot load neither libmkl_avx.so nor libmkl_def.so
之后程序停止

我已经检查了
libmkl_avx.so
libmkl_def.so
都在
$LD_LIBRARY_路径中

最终链接通过以下方式完成:

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 
libfrBost是链接的模块,然后

运行导入模块libfrrobost的
pythont83.py
(尤其是在准备二进制文件时,链接器不会抱怨)会导致错误

试图用谷歌搜索。我找到的所有信息都与用C/Fortran编写的“常用程序”有关,其中只包括英特尔的MKL。我可以毫无问题地运行这种程序。我认为Makefile中链接行的MKL部分在这两种情况下是等效的,但肯定有一个隐藏的秘密。问题通常是链接不好-我认为这不适用(这些库与英特尔的手动接口完全相同,线程和计算库是相当标准的)

使用的编译器:

ifort 12.1.0、icpc 12.1.0、python 2.7.1、icc 12.1.0(小C代码段也调用MKL,但是)

编辑(由于Hirsto Iliev的评论)

我以这种方式运行strace:
stracepythont83.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
,一切都是一样的


免责声明:虽然我可能听起来对我写的东西很自信,但我不是。每句话都应该以“如果我没弄错”开头.

似乎解决方案是链接
-lmkl\u rt
而不是
-lmkl\u sequential-lmkl\u intel\u lp64-lmkl\u core
。我不明白为什么一个要优于另一个。我很困惑,但这是可行的(到目前为止)

编辑
英特尔人声称这是MKL库的错误。

为我提出的解决方案效果良好

export LD_PRELOAD=/opt/intel/mkl/lib/intel64/libmkl_core.so:/opt/intel/mkl/lib/intel64/libmkl_sequential.so

这似乎是某种bug。

使用
strace-f-e Trace=file-o Trace.out./program args…
跟踪您的程序,然后在
Trace.out
中搜索
libmkl_def
以查看在哪些位置
dlopen()
实际上是在寻找它。和蔼可亲!我不知道这个命令。但是结果并不令人满意。我将编辑主要帖子并在那里回答,因为我需要比评论更多的空间和更多的格式选项。接受一些专业建议----帮了我不止一次的忙--我刚刚尝试过。不幸的是,它产生了e与我在Makefile中使用的链接行相同(唯一的区别是:其中没有
-Wl、-start group
-Wl、-end group
,这应该无关紧要(而且它没有-我已经通过重新编译进行了检查))mkl_rt是一个包装库,它可以为您的平台打开适当的mkl_rt。您应该始终链接mkl_rt,而不是特定的mkl_rt。我看到了许多相关的问题/答案,但这个答案是唯一解决此问题的答案。+1,当我使用针对mkl构建的英特尔编译python numpy/scipy发现此错误时,对我也起到了作用库。
locate mkl
将显示您的位置,如果它未安装在默认位置,非常感谢。我在
中构建了一些东西。configure
脚本未链接到
mkl\u rt
。这节省了时间!