我无法在 64 位平台的 Visual Studio 2013 中编译介绍性 Lapack 代码。我正在尝试做的事情摘要:
- 启动并运行 Lapack,以支持我在 Visual Studio 2013 中编写的 64 位 C++ 软件。
- 我正在使用http://icl.cs.utk.edu/lapack-for-windows/lapack/#build中给出的相同指示按照使用预构建库(*.dll、*.lib 和 *.h)的说明并在我的构建中引用这些库。
我正在执行的 Visual Studio 步骤:
- 我开始一个新项目 - 选择 Visual C++ 空项目模板
- 在项目属性中,我首先转到配置管理器并创建一个新的 x64 解决方案平台(复制 Win32 设置)
- 然后,对于所有配置和所有平台,我将链接器附加库依赖项指向放置预构建 *.lib 文件的位置。我还添加到链接器 => 按照指示输入 libblas.lib 和 liblapack.lib 库。
- 注 1:我还没有添加任何 Lapacke 的东西,因为我不相信我尝试运行的简单示例程序需要这些东西(并且添加这些路径在早期的尝试中似乎没有帮助) .)
- 注 2:我知道我下载的库仅限 64 位 - 但我将这些项目属性应用于“所有平台”(意味着包括 32 位平台)以演示一些内容,如下...
- 然后在 Visual Studio 中,我添加了一个 C++ 源文件“source.cpp”,其中包含 www.cs.rochester.edu/~bh/cs400/using_lapack.html 中提供的代码。这是代码
#include < stdio.h>
extern "C" void dgesv_(const int *N, const int *nrhs, double *A, const int *lda, int *ipiv, double *b, const int *ldb, int *info);
extern "C" void dgels_(const char *trans, const int *M, const int *N, const int *nrhs, double *A, const int *lda, double *b, const int *ldb, double *work,
const int * lwork, int *info);
int main(void)
{
double A[9] = { 76, 27, 18, 25, 89, 60, 11, 51, 32 };
double b[3] = { 10, 7, 43 };
int N = 3;
int nrhs = 1;
int lda = 3;
int ipiv[3];
int ldb = 3;
int info;
dgesv_(&N, &nrhs, A, &lda, ipiv, b, &ldb, &info);
if (info == 0) /* succeed */
printf("The solution is %lf %lf %lf\n", b[0], b[1], b[2]);
else
fprintf(stderr, "dgesv_ fails %d\n", info);
return info;
}
- 然后我尝试为 x64 平台编译此程序(在调试或发布配置中)并收到错误:
error LNK2019: unresolved external symbol dgesv_ referenced in function main
这似乎表明预构建的库不包含这些函数。
- 非常奇怪的是,如果我将平台更改为“win32”,该项目就会编译! (嗯?)所以它正在寻找适用于 32 位平台的库。 (顺便说一句,如果我尝试运行那里生成的可执行文件,我会收到一个错误,指出缺少 *.dll 文件 - 这并不奇怪,因为我只下载了 64 位库...)
此外,在代码中的 dgesv_ 之前添加下划线似乎也不起作用 - 在编译时给我错误:
fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'
它还跟踪了 icl.cs.utk.edu/lapack-forum/viewtopic.php?f=12&t=4260 上的一些讨论
同样,整个问题似乎都在追踪 http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=12&t=4260 的讨论。那里的人似乎表明用 CMAKE 自己构建库是一个解决方案(我正在尝试这样做,但遇到了问题,在我下载的 MinGW-W64 库中找不到合适的 fortran 编译器 <= 这可能适合不同的帖子!)。更重要的是,在该线程的最后一篇文章中,“管理员”表示他们纠正了这些预构建库以前的任何问题,并且它们现在应该可以工作。所以我一定做错了什么,对吧?有人发现我在这里使用的工作流程有问题吗?
最佳答案
我在这方面做了更多工作(并与 Lapack 论坛上的一些人进行了交流)。那里有两篇文章描述了详细信息:
第一个,位于 http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=12&t=4873&p=11711#p11711 ,基本上重复了我上面问的问题。从该界面得出的结论是,icl.c.utk.edu 上提供的预构建库对于我的系统来说已经过时,因此鼓励我使用 CMake 构建自己的 Lapack 库。
第二篇文章,地址:http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=12&t=4875&p=11710#p11710 ,描述了我在使用 CMake 生成这些库时遇到的问题。我按照 http://icl.cs.utk.edu/lapack-for-windows/lapack/#build 上的详细说明进行操作但我在使用 CMake 时犯了一个错误。最重要的是,我需要在 CMake 中指定“MinGW Makefiles”作为我的“生成器”(我指定的是“Visual Studio”!)。完成此操作后,一切都按照原始说明进行,并且我能够编译上面描述的简单 Visual Studio 项目。
关于c++ - 链接 LAPACK、64 位、Visual Studio 2013,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34602590/