链接LAPACK,64位,Visual Studio 2013

时间:2016-01-05 00:54:24

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

我无法在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模板
  • 在项目属性中,我首先转到Configuration Manager并创建一个x64的新解决方案平台(复制Win32设置)
  • 然后,对于所有配置和所有平台,我将链接器附加库依赖项指向我放置预构建的* .lib文件的位置。我还添加了Linker =>按照说明输入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;
}
  • 然后我尝试编译这个程序(在Debug或Release配置中) - 对于x64平台并得到错误:
  

错误LNK2019:函数main

中引用了未解析的外部符号dgesv_

似乎表明预构建的库不包含这些函数。

  • 非常奇怪的是,如果我将平台更改为&#39; win32&#39;,项目会编译! (呵呵?)所以它找到了32位平台的那些库。 (顺便说一句,如果我尝试运行那里生成的可执行文件,我会收到一个* .dll文件丢失的错误 - 鉴于我只下载了64位库,这并不奇怪......)

另外,在代码中在dgesv_之前添加下划线似乎也不起作用 - 在编译时给我错误:

  

致命错误LNK1112:模块机器类型&#39; X86&#39;与目标机器类型冲突&#39; x64&#39;

也跟踪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编译器&lt; =那可能适用于不同的帖子!)。更重要的是,在该主题的最后一篇文章中,&#39; admin&#39;表示他们纠正了这些预先建立的图书馆的任何先前问题,并且他们现在应该工作。所以我一定做错了,对吗?有没有人在我在这里使用的工作流程中看到问题?

1 个答案:

答案 0 :(得分:1)

我在这方面做了更多的工作(并在Lapack讨论论坛上与一些人交流)。那里有两个帖子描述了细节: