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++ - 对 'd1mach_' 的 undefined reference

c++ - LZ4 压缩的源代码是否兼容 64 位?

c++ - C++中的非空终止字符数组

c++ - 带有附加变量的 Glfw 回调

visual-studio - Xamarin Visual Studio 无法在联网 MAC 上启动构建服务器激活

c# - Unity3d,当前选择的脚本后端(.NET)未安装

c++ - Allegro 5 al_create_display(x, y) 不工作

c# - 动态创建的 PDF 不在 64 位 IE9 窗口中嵌入/呈现内联

c++ - 我应该使用全局变量还是每次都调用该函数? C++

c++ - 在混合 Fortran/C++ 解决方案中能否安全地忽略 LNK4006 警告?