【发布时间】:2015-02-16 13:23:38
【问题描述】:
摘要:我使用 lapack 创建了一个简单的 c++ 示例。由于链接错误,我无法使用 CMake 和 Visual Studio 2013 编译它。
配置: Windows 7 64 位、Visual Studio 12 2013 Win64、编译器 intel64、CMake 3.1.0、Lapack 3.5.0。
Lapack 安装: 我使用 Intel 的编译器使用 CMake 构建了 lapack 3.5.0。我激活了除 BUILD_SHARED_LIBS 之外的所有 BUILD_* 选项。我在发布模式下使用 Visual Studio 构建。我在我的安装目录中获得了两个lib文件:blas.lib和lapack.lib。
C++ 示例:我使用函数 ilaver(给出 lapack 的版本)创建了以下简单的 C++ 示例。
#include <iostream>
extern "C" { void ilaver_(int* major, int* minor, int* patch); }
int main(int argc, char** argv)
{
int major = 0; int minor = 0; int patch = 0;
ilaver_(&major, &minor, &patch);
std::cout << major << "." << minor << "." << patch << std::endl;
return 0;
}
CMakeLists.txt:我还创建了相关的 CMakeLists 文件:
cmake_minimum_required(VERSION "2.8.9")
project(linklapack)
enable_language(C)
enable_language(CXX)
enable_language(Fortran)
set(LAPACK_LIBDIRS "C:/softs/lapack/3.5.0/64/lib")
set(LAPACK_LIBRARIES lapack)
link_directories(${LAPACK_LIBDIRS})
add_executable(GetLapackVersion ${CMAKE_SOURCE_DIR}/GetLapackVersion.cpp)
target_link_libraries(GetLapackVersion ${LAPACK_LIBRARIES})
install(TARGETS GetLapackVersion DESTINATION ${CMAKE_INSTALL_PREFIX})
在 Linux 下: 可以。 (当然是通过改变lib的路径)
在 Windows 下:我使用相同的编译器和相同的 Visual Studio 配置启动了 CMake。我为 Visual Studio 加载了生成的解决方案,并构建了“GetLapackVersion”目标。然后我收到以下链接错误:
2>GetLapackVersion.obj : error LNK2019: unresolved external symbol ilaver_ referenced in function main
2>C:\Users\caduchon\Documents\Christophe\linklapack\BUILD\Release\GetLapackVersion.exe : fatal error LNK1120: 1 unresolved externals
编辑: Visual Studio 中针对目标的链接命令如下:
/OUT:"C:\Users\caduchon\Documents\Christophe\linklapack\BUILD\Release\GetLapackVersion.exe" /MANIFEST /NXCOMPAT /PDB:"C:/Users/caduchon/Documents/Christophe/linklapack/BUILD/Release/GetLapackVersion.pdb" /DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "comdlg32.lib" "advapi32.lib" "lapack.lib" /IMPLIB:"C:/Users/caduchon/Documents/Christophe/linklapack/BUILD/Release/GetLapackVersion.lib" /MACHINE:X64 /INCREMENTAL:NO /PGD:"C:\Users\caduchon\Documents\Christophe\linklapack\BUILD\Release\GetLapackVersion.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"GetLapackVersion.dir\Release\GetLapackVersion.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"C:/softs/lapack/3.5.0/64/lib" /LIBPATH:"C:/softs/lapack/3.5.0/64/lib/Release" /TLBID:1
我不知道如何解决这个问题...在此先感谢您的帮助。
【问题讨论】:
-
dumpbin /ALL lapack.lib是否显示未解析的符号存在? -
我执行了命令。我看到函数的签名似乎是大写的。我尝试使用 ILAVER,但现在我遇到了另一个链接问题(无法打开文件 'ifconsol.lib')。所以链接lapack的问题也许就解决了。感谢这个有用的工具。
-
这是一个英特尔库。您是否有理由不使用英特尔编译器套件编译所有内容?这可能会缓解您遇到的一些问题。
-
我在多个平台上使用 CMake 进行编译。 CMake 生成 VS 文件。我不确定 CMake 是否可以为您谈论的编译器套件生成文件,我不确定我们是否可以为其购买许可证。但是我解决了这个问题,我找到了如何通知 CMake 关于 intel libdir。
-
嗯,对于Windows上的CMake+intel,可以生成VS工程文件,然后在IDE里面设置编译器为Intel。但是,是的,如果您只有 Fortran 编译器,那可能是一个昂贵的选择。很高兴我能帮上忙!
标签: c++ linker cmake intel lapack