C++ 链接LAPACK,64位,Visual Studio 2013
我无法在Visual Studio 2013中为64位平台编译介绍性Lapack代码。我要做的事情的总结: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
- 让LAPACK运行并支持64位C++软件,我在Visual Studio 2013中编写。李>
- 我使用的是在中给出的相同说明,即以下关于使用预构建库(*.dll、*.lib&*.h)和引用我的构建中的库的说明
- 启动一个新项目——选择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平台编译此程序(在调试或发布配置中),并得到错误:
- 非常奇怪的是,如果我将平台更改为“win32”,项目将编译!(哈?)所以它正在为32位平台寻找这些库。(顺便说一句,如果我尝试运行在那里生成的可执行文件,我会得到一个错误,即*.dll文件丢失-这并不奇怪,因为我只下载了64位库…)
同样,整个问题似乎都在跟踪上的讨论,那里的人似乎表示,用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;
}