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
;结果是(在greppinglibmkl
之后):
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
。这节省了时间!