将英特尔的MKL(BLAS和LAPACK)链接到GCC

3

我正在尝试编译一个庞大的软件包,但这是我似乎无法解决的最后一道障碍。

我遇到了以下错误:

RNDiracDeterminantBase.cpp:(.text+0x22bf): undefined reference to `dgetrf_'
RNDiracDeterminantBase.cpp:(.text+0x2524): undefined reference to `dgetri_'
RNDiracDeterminantBase.cpp:(.text+0x3005): undefined reference to `dgetri_'
../../lib/libqmcwfs.a(RNDiracDeterminantBase.cpp.o): In function `qmcplusplus::RNDiracDeterminantBase::ratio(qmcplusplus::ParticleSet&, int, qmcplusplus::ParticleAttrib<qmcplusplus::TinyVector<double, 3u> >&, qmcplusplus::ParticleAttrib<double>&)':
RNDiracDeterminantBase.cpp:(.text+0x4156): undefined reference to `dgemv_'
RNDiracDeterminantBase.cpp:(.text+0x420f): undefined reference to `dger_'

谷歌透露这些参考资料是指英特尔的MKL库。然而,我不知道需要链接哪个文件。我已经尝试过libmkl_core.a、libmkl_gnu_thread.a、libmkl_blacs_intelmpi_lp64.a等文件。在/mkl/lib/intel64/目录下有大量文件可用。如果需要,可以发布更多信息。

1
请不要在您的问题中进行广告宣传。 - user229044
那么,你能帮我解答我的问题吗? - Nick
既然你似乎消失了,我会把标题改回来。如果你回来了,随时可以重新编辑。 - Nick
请不要在您的问题中广告。 - OmnipotentEntity
1
是的,但事实是,目前没有赏金,将其放在标题中进行宣传是不诚实的。这也会分散注意力并干扰SO自动系统为您提供类似问题的功能。这也对其他试图获得答案的人很无礼。 - OmnipotentEntity
显示剩余5条评论
3个回答

10

我不知道我需要链接哪个文件。我已经尝试了libmkl_core.a、libmkl_gnu_thread.a、libmkl_blacs_intelmpi_lp64.a等等。在/mkl/lib/intel64/目录下有大量的文件。

有很多文件并不意味着你必须一个一个地尝试每个库。

要找出哪个库定义了你想要的符号,请运行此命令:

cd /mkl/lib/intel64
nm -A *.a | egrep '[TWBD] (dger_|dgemv_|dgetrf_|dgetri_)$'

确保把库文件放在链接行的末尾,因为命令行上档案库的顺序很重要


4
基于您提供的不完整信息,您可能需要libmkl_intel_lp64.a、libmkl_gnu_thread.a和libmkl_core.a。Intel MKL内置了一个工具来帮助您确定链接:/mkl/tools/mkl_link_tool。此工具也可在Web上使用:http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor。使用该工具获取您特定情况下的确切链接行。
您应该在官方MKL论坛(http://software.intel.com/en-us/forums/intel-math-kernel-library)上提问。这种类型的问题您将能够在几个小时内得到答案,而不是几天。

4
我在Windows上安装mingw时遇到了类似的问题。以下是使用gcc工具链时适用于我的库链接顺序:
  1. mkl_intel_thread
  2. mkl_rt
  3. mkl_core
  4. mkl_intel_lp64
希望这对于任何卡在这个问题上的人有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接