【发布时间】:2016-01-05 00:54:23
【问题描述】:
我无法在 Visual Studio 2013 中为 64 位平台编译介绍性 Lapack 代码。我正在尝试做的总结:
- 启动并运行 Lapack 以支持我在 Visual Studio 2013 中编写的 64 位 C++ 软件。
- 我正在使用与 http://icl.cs.utk.edu/lapack-for-windows/lapack/#build 相同的说明,方法是按照说明使用预构建库(*.dll、*.lib 和 *.h)并在我的构建中引用这些库。
我正在执行的 Visual Studio 步骤:
- 我开始一个新项目 - 选择 Visual C++ Empty Project 模板
- 在项目属性中,我首先进入配置管理器,新建一个x64的解决方案平台(复制Win32设置)
- 然后,对于所有配置和所有平台,我将链接器附加库依赖项指向我放置预构建 *.lib 文件的位置。我还添加到链接器 => 按照说明输入 libblas.lib 和 liblapack.lib 库。
- 注意 1:我还没有添加任何 Lapacke 的东西,因为我不相信我正在尝试运行的简单示例程序需要这些东西(并且添加这些路径在早期的尝试中似乎没有帮助.)
- 注意 2:我知道我下载的库仅为 64 位 - 但我将这些项目属性应用于“所有平台”(意味着包括 32 位平台)以演示以下内容...
- 然后在 Visual Studio 中,我使用 www.cs.rochester.edu/~bh/cs400/using_lapack.html 中提供的代码添加了一个 C++ 源文件“source.cpp”。这是代码
#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 平台编译此程序(在调试或发布配置中)并得到错误:
错误 LNK2019:函数 main 中引用的未解析的外部符号 dgesv_
这似乎表明预建库不包含这些功能。
- 非常奇怪的是,如果我将平台更改为“win32”,项目就会编译! (嗯?)所以它正在为 32 位平台寻找那些库。 (顺便说一句,如果我尝试运行那里生成的可执行文件,我会收到一个 *.dll 文件丢失的错误 - 这并不奇怪,因为我只下载了 64 位库......)
此外,在代码中的 dgesv_ 之前添加下划线似乎也不起作用 - 编译时出现错误:
致命错误 LNK1112:模块机器类型“X86”与目标机器类型“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 编译器
【问题讨论】:
标签: c++ visual-studio 64-bit lapack