链接 LAPACK,64 位,Visual Studio 2013
Linking LAPACK, 64-bit, Visual Studio 2013
我无法在 Visual Studio 2013 中为 64 位平台编译介绍性的 Lapack 代码。我正在尝试做的事情的总结:
- 启动 Lapack 并 运行ning 支持我在 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 位的 - 但我将这些项目属性应用到 'all platforms'(意味着包括 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 平台编译这个程序(在调试或发布配置中)并得到错误:
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 自己构建库是一个解决方案(我正在尝试,但 运行ning问题是它在我下载的 MinGW-W64 库中找不到合适的 fortran 编译器 <= 这可能适合不同的 post!)。更重要的是,在该线程的最后 post 中,'admin' 表示他们纠正了这些预构建库之前的任何问题,并且它们现在应该可以工作了。所以我一定是做错了什么,对吧?有人看到我在这里使用的工作流程有问题吗?
我在这方面做了更多工作(并在 Lapack 论坛上与一些人交流)。那里有两个 post 描述了细节:
第一个,在 http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=12&t=4873&p=11711#p11711,基本上重复了我上面提出的问题。从该界面得出的结论是 icl.c.utk.edu 上可用的 pre-built 库对我的系统来说是 out-of-date,我被鼓励使用 CMake 构建我自己的 Lapack 库。
第二个 post,位于 http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=12&t=4875&p=11710#p11710, describes a problem I was having getting CMake to generate these libraries. I was following the detailed instructions at http://icl.cs.utk.edu/lapack-for-windows/lapack/#build,但我在使用 CMake 时犯了一个错误。最重要的是,我需要在 CMake 中将 'MinGW Makefiles' 指定为我的 'generator'(我指定的是 'visual studio'!)。一旦我这样做了,一切都按照原始说明进行,我能够编译上面描述的简单 Visual Studio 项目。
我无法在 Visual Studio 2013 中为 64 位平台编译介绍性的 Lapack 代码。我正在尝试做的事情的总结:
- 启动 Lapack 并 运行ning 支持我在 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 位的 - 但我将这些项目属性应用到 'all platforms'(意味着包括 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 平台编译这个程序(在调试或发布配置中)并得到错误:
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 自己构建库是一个解决方案(我正在尝试,但 运行ning问题是它在我下载的 MinGW-W64 库中找不到合适的 fortran 编译器 <= 这可能适合不同的 post!)。更重要的是,在该线程的最后 post 中,'admin' 表示他们纠正了这些预构建库之前的任何问题,并且它们现在应该可以工作了。所以我一定是做错了什么,对吧?有人看到我在这里使用的工作流程有问题吗?
我在这方面做了更多工作(并在 Lapack 论坛上与一些人交流)。那里有两个 post 描述了细节:
第一个,在 http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=12&t=4873&p=11711#p11711,基本上重复了我上面提出的问题。从该界面得出的结论是 icl.c.utk.edu 上可用的 pre-built 库对我的系统来说是 out-of-date,我被鼓励使用 CMake 构建我自己的 Lapack 库。
第二个 post,位于 http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=12&t=4875&p=11710#p11710, describes a problem I was having getting CMake to generate these libraries. I was following the detailed instructions at http://icl.cs.utk.edu/lapack-for-windows/lapack/#build,但我在使用 CMake 时犯了一个错误。最重要的是,我需要在 CMake 中将 'MinGW Makefiles' 指定为我的 'generator'(我指定的是 'visual studio'!)。一旦我这样做了,一切都按照原始说明进行,我能够编译上面描述的简单 Visual Studio 项目。