如何使用qmake链接到Windows 64位上的ACML? 我正在使用简化我的C++开发。project在Linux和Windows中都能正常工作(两者都是64位)。我使用Qt-Creator+qmake来构建项目,以跨平台保留单个工具集

如何使用qmake链接到Windows 64位上的ACML? 我正在使用简化我的C++开发。project在Linux和Windows中都能正常工作(两者都是64位)。我使用Qt-Creator+qmake来构建项目,以跨平台保留单个工具集,c++,dll,linker,x86-64,qmake,C++,Dll,Linker,X86 64,Qmake,我直接将犰狳纳入我的项目。因为它是一个模板库,所以不需要编译;包括标题就足够了 现在我想用它来加快速度,因为它在Linux和Windows上都是免费的。因此,我通过ACML将Armadillo的config.hpp设置为使用LAPACK+BLAS,使用: #define ARMA_USE_LAPACK #define ARMA_USE_BLAS #define ARMA_BLAS_CAPITALS 在Linux上,编译+链接工作正常。我的qmake项目文件包含以下内容: unix: {

我直接将犰狳纳入我的项目。因为它是一个模板库,所以不需要编译;包括标题就足够了

现在我想用它来加快速度,因为它在Linux和Windows上都是免费的。因此,我通过ACML将Armadillo的config.hpp设置为使用LAPACK+BLAS,使用:

#define ARMA_USE_LAPACK
#define ARMA_USE_BLAS
#define ARMA_BLAS_CAPITALS
在Linux上,编译+链接工作正常。我的qmake项目文件包含以下内容:

unix: {
    INCLUDEPATH += /usr/include/acml/gfortran/
    LIBS += -L/usr/lib/acml/gfortran/ -lacml_mp
}
在生成的可执行文件上使用ldd可以揭示对/usr/lib/acml/gfortran/libacml_mp.so的共享库依赖性

但是在Windows上,我找不到正确的链接标志来链接ACML。我使用的是使用英特尔64位Windows Fortran编译器编译的。根据PDF手册(作为acml.PDF包含在acml的存档文件中,第2.3.2节),在Windows上动态链接的方式如下:

cl driver.c -Ic:\acml5.3.1\ifort64_mp\include c:\acml5.3.1\ifort64_mp\lib\libacml_mp_dll.lib
当然,当路径更改为正确路径时(cl不是链接器,而是编译器…)

所以基本上,它应该只是将*libacml\u mp\u dll.lib*文件添加到链接命令中

不幸的是,我无法正确链接。我将其添加到Windows上的qmake项目文件中:

LIBS += $$quote(C:\AMD\acml5.3.1\ifort64_mp\lib\libacml_mp_dll.lib)
路径正常,文件存在,等等

我不断收到链接错误,第一个是(所有其他的都是类似的):

然后,我手动将库添加到linker命令中。我试过这些:

link.exe  /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:CONSOLE "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='*******************' language='*' processorArchitecture='*'" /MANIFEST /MANIFESTFILE:debug\project.exe.embed.manifest /OUT:debug\project.exe debug/*.obj /LIBPATH:C:\Boost\1.54.0\lib /LIBPATH:"C:\Program Files\HDF_Group\HDF5\1.8.11\bin" hdf5.lib hdf5_hl.lib /LIBPATH:"C:\Program Files\HDF_Group\HDF5\1.8.11\lib" /LIBPATH:C:\AMD\acml5.3.1\ifort64_mp\lib libacml_mp_dll.lib
link.exe  /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:CONSOLE "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='*******************' language='*' processorArchitecture='*'" /MANIFEST /MANIFESTFILE:debug\project.exe.embed.manifest /OUT:debug\project.exe debug/*.obj /LIBPATH:C:\Boost\1.54.0\lib /LIBPATH:"C:\Program Files\HDF_Group\HDF5\1.8.11\bin" hdf5.lib hdf5_hl.lib /LIBPATH:"C:\Program Files\HDF_Group\HDF5\1.8.11\lib" C:\AMD\acml5.3.1\ifort64_mp\lib\libacml_mp_dll.lib
link.exe  /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:CONSOLE "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='*******************' language='*' processorArchitecture='*'" /MANIFEST /MANIFESTFILE:debug\project.exe.embed.manifest /OUT:debug\project.exe C:\AMD\acml5.3.1\ifort64_mp\lib\libacml_mp_dll.lib debug/*.obj /LIBPATH:C:\Boost\1.54.0\lib /LIBPATH:"C:\Program Files\HDF_Group\HDF5\1.8.11\bin" hdf5.lib hdf5_hl.lib /LIBPATH:"C:\Program Files\HDF_Group\HDF5\1.8.11\lib"

但是这些命令上的每个命令都会失败,并出现相同的链接器错误。

您将遇到以下错误:

File.obj:-1: error: LNK2019: unresolved external symbol sgetrf_
其中编译器正在抱怨函数名sgetrf\ux。请注意,它都是小写的。ACML是否需要Blas和Lapack函数名都使用大写字母


我建议您在Armadillo的Linux和Windows安装中检查是否启用了ARMA_BLAS_大写字母。

问题在于ACML中包含的BLAS没有下划线作为后缀。因此,犰狳的ARMA_BLAS_下划线标志必须在config.hpp中注释:

// #define ARMA_BLAS_UNDERSCORE
我使用的qmake配置如下所示:

win32: {
    ACMLDIR = $$quote(C:\AMD\acml5.3.1\ifort64_mp)
    INCLUDEPATH += $$quote($$ACMLDIR\include)
    LIBS += -L$$quote($$ACMLDIR\lib) -llibacml_mp_dll
}

ARMA_BLAS_大写字母应该定义,但我会在周一再次检查。我记得玩过这个旗子,看到链接错误是指向SGETRF_和其他人的,而不是指向SGETRF_。我认为ACML确实需要资本化。此外,我没有安装犰狳;我把它直接放在我的项目中。这是一个模板库,因此不需要编译,只有#include'ing.Activating ARMA_BLAS_CAPITALS给出了相同的链接错误,但使用符号SGETRF_u而不是sgretrf_u.Hmm。也许ACML也不喜欢在函数末尾加下划线?试着用下划线注释ARMA_BLAS_。否则,我建议询问AMD/ACML开发人员sgetrf函数发生了什么变化。或者如果有多个ACML库可以链接?(例如,LAPACK函数在一个库中,BLAS函数在另一个库中)您猜对了!ARMA_BLAS_下划线//必须//注释//(禁用添加下划线)。。。我可以成功链接。很高兴听到这是排序。为了进一步澄清这一点:Linux版本的ACML是否也要求禁用下划线?
// #define ARMA_BLAS_UNDERSCORE
win32: {
    ACMLDIR = $$quote(C:\AMD\acml5.3.1\ifort64_mp)
    INCLUDEPATH += $$quote($$ACMLDIR\include)
    LIBS += -L$$quote($$ACMLDIR\lib) -llibacml_mp_dll
}