c++ - 链接 LAPACK、64 位、Visual Studio 2013

标签 c++ visual-studio 64-bit lapack

我无法在 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 步骤:

  • 我开始一个新项目 - 选择 V​​isual 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 论坛上的一些人进行了交流)。那里有两篇文章描述了详细信息:

关于c++ - 链接 LAPACK、64 位、Visual Studio 2013,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34602590/

相关文章:

c++ - 代码块 C++ 错误 : Was not declared in the scope

c++ - 我可以将用 clang c++11 编译的对象与另一个用 c++17 编译的对象链接起来吗

C++:遍历对象以调用相同的方法

linux - 在 x86-64 程序集中打印数字

c++ - 当函数接受 T&& 的参数并传递左值时,模板参数 T 是否应该解析为 T&?

c++ - XML文件生成器

c++ - 如何从 CMake 中隐藏 Visual Studio 中的目标

c# - 事件发生后表格会自行缩小

linux - 在 64 位 Linux 机器上的 gcc 中制作 'long' 4 字节

maven - 生成的安装程序创建指向错误可执行文件的快捷方式