C++ 链接LAPACK,64位,Visual Studio 2013

C++ 链接LAPACK,64位,Visual Studio 2013,c++,visual-studio,64-bit,lapack,C++,Visual Studio,64 Bit,Lapack,我无法在Visual Studio 2013中为64位平台编译介绍性Lapack代码。我要做的事情的总结: 让LAPACK运行并支持64位C++软件,我在Visual Studio 2013中编写。李> 我使用的是在中给出的相同说明,即以下关于使用预构建库(*.dll、*.lib&*.h)和引用我的构建中的库的说明 我正在执行的Visual Studio步骤: 启动一个新项目——选择VisualC++空项目模板< /LI> 在项目属性中,我首先转到Configuration Manager

我无法在Visual Studio 2013中为64位平台编译介绍性Lapack代码。我要做的事情的总结:

  • 让LAPACK运行并支持64位C++软件,我在Visual Studio 2013中编写。李>
  • 我使用的是在中给出的相同说明,即以下关于使用预构建库(*.dll、*.lib&*.h)和引用我的构建中的库的说明
我正在执行的Visual Studio步骤:

  • 启动一个新项目——选择VisualC++空项目模板< /LI>
  • 在项目属性中,我首先转到Configuration Manager并创建一个新的x64解决方案平台(复制Win32设置)
  • 然后,对于所有配置和所有平台,我将链接器附加库依赖项指向我放置预构建的*.lib文件的位置。我还向Linker=>添加libblas.lib和liblapack.lib库,如指示所示
  • 注1:我还没有添加任何Lapacke内容,因为我不相信我正在尝试运行的简单示例程序需要这些内容(并且添加这些路径在以前的尝试中似乎没有帮助)
  • 注2:我知道我下载的库仅为64位-但我将这些项目属性应用于“所有平台”(意味着包括32位平台)以演示以下内容
  • <> LI>在VisualStudio中,我添加了一个C++源文件“源.CPP”,代码是在www. cb.罗切斯特。这是密码

#包括
外部“C”无效dgesv_(常量int*N,常量int*nrhs,双*A,常量int*lda,int*ipiv,双*b,常量int*ldb,int*info);
外部“C”无效dgels(常量字符*trans,常量整数*M,常量整数*N,常量整数*nrhs,双*A,常量整数*lda,双*b,常量整数*ldb,双*work,
const int*lwork,int*info);
内部主(空)
{
双A[9]={76,27,18,25,89,60,11,51,32};
双b[3]={10,7,43};
int N=3;
int-nrhs=1;
int-lda=3;
int ipiv[3];
int-ldb=3;
国际信息;
dgesv(编号和nrhs、A和lda、ipiv、b和ldb以及信息);
如果(info==0)/*成功*/
printf(“解决方案是%lf%lf%lf\n”,b[0],b[1],b[2]);
其他的
fprintf(标准,“dgesv_uu失败%d\n”,信息);
退货信息;
}
  • 然后我尝试为x64平台编译此程序(在调试或发布配置中),并得到错误:
错误LNK2019:未解析的外部符号dgesv_u在函数main中引用

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

  • 非常奇怪的是,如果我将平台更改为“win32”,项目将编译!(哈?)所以它正在为32位平台寻找这些库。(顺便说一句,如果我尝试运行在那里生成的可执行文件,我会得到一个错误,即*.dll文件丢失-这并不奇怪,因为我只下载了64位库…)
此外,在代码中的dgesv_u之前添加下划线似乎也不起作用-编译时出现错误:

致命错误LNK112:模块计算机类型“X86”与目标计算机类型“x64”冲突

它还跟踪了icl.cs.utk.edu/lapack forum/viewtopic.php?f=12&t=4260上的一些讨论


同样,整个问题似乎都在跟踪上的讨论,那里的人似乎表示,用CMAKE自己构建库是一个解决方案(我正在尝试,但遇到了一些问题,在我下载的MinGW-W64库中找不到合适的fortran编译器我在这方面做了更多工作(并与Lapack讨论论坛上的一些人进行了交流)。这里有两篇文章描述了细节:

  • 第一个,在,基本上重复了我上面提出的问题。从该接口得出的结论是,icl.c.utk.edu上提供的预构建库对于我的系统来说已经过时,我被鼓励使用CMake构建自己的Lapack库

  • 第二篇文章,在,描述了我在让CMake生成这些库时遇到的一个问题。我遵循了在的详细说明,但在如何使用CMake时犯了一个错误。总之,我需要在CMake中指定“MinGW Makefiles”作为我的“生成器”(我指定了“visual studio”!).一旦我这样做了,一切都按照最初的方向进行,我就能够编译我上面描述的简单的Visual Studio项目

 #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;
}