Windows 10 Can';无法让LAPACK在windows上运行

Windows 10 Can';无法让LAPACK在windows上运行,windows-10,mingw,lapack,Windows 10,Mingw,Lapack,我正在尝试让LAPACK在windows上运行。我从netlib.org下载了3.8.0版,并使用CMAKE构建了库 我没有MSVC许可证,所以我使用的是mingw64。这是我的密码: #include "lapacke.h" #include <iostream> extern "C" { extern int LAPACKE_zgesv(int matrix_order, lapack_int n, lapack_int nrhs,

我正在尝试让LAPACK在windows上运行。我从netlib.org下载了3.8.0版,并使用CMAKE构建了库

我没有MSVC许可证,所以我使用的是mingw64。这是我的密码:

#include "lapacke.h"
#include <iostream>

extern "C" {
   extern int LAPACKE_zgesv(int matrix_order, lapack_int n, lapack_int nrhs,
                          lapack_complex_double* a, lapack_int lda,
                          lapack_int* ipiv, lapack_complex_double* b,
                          lapack_int ldb );
    }

using namespace std;

int main (int argc, char* argv[])
{
   cout << "Hello 1" << endl;

   /* Locals */
   lapack_int n = 4, nrhs = 2, lda = 4, ldb = 2, info;
   /* Local arrays */
   lapack_int ipiv[4];
   lapack_complex_double a[4*4] = {
      { 1.23, -5.50}, { 7.91, -5.38}, {-9.80, -4.86}, {-7.32,  7.57},
      {-2.14, -1.12}, {-9.92, -0.79}, {-9.18, -1.12}, { 1.37,  0.43},
      {-4.30, -7.10}, {-6.47,  2.52}, {-6.51, -2.67}, {-5.86,  7.38},
      { 1.27,  7.29}, { 8.90,  6.92}, {-8.82,  1.25}, { 5.41,  5.37}
   };
   lapack_complex_double b[2*4] = {
      { 8.33, -7.32}, {-6.11, -3.81},
      {-6.18, -4.80}, { 0.14, -7.71},
      {-5.71, -2.80}, { 1.41,  3.40},
      {-1.60,  3.08}, { 8.54, -4.05}
   };     

   info = LAPACKE_zgesv( LAPACK_ROW_MAJOR, n, nrhs, a, lda, ipiv, b, ldb );

   cout << "Hello 2" << endl;
}
编译器运行时没有错误,但当我运行可执行文件时,没有得到任何输出。不执行程序开始和结束时的
cout
s。当我用
LAPACKE_zgesv
函数注释掉该行时,我确实从
cout
s获得了输出

所以我不确定发生了什么。程序似乎注意到,由于某种原因,它找不到LAPACK函数,只是退出了,但没有任何抱怨。

请从中尝试3.9.0版

对于我来说,这在MinGW-w64中构建得很好,尽管我必须在运行
cmake
之前运行这些命令来修复以下内容中提到的问题:


好的,我知道问题是什么。我需要将libblas.dll、liblapack.dll和liblapacke.dll放在.exe所在的目录中。我之所以发现,是因为我尝试了黑色cmd shell来改变,这让我明白了。该死的Powershell认为没有必要对丢失的DLL说任何话。伙计


我还必须将libstdc++-6.dll、libgcc__seh-1.dll、libgfortran-5.dll、libquadmath-0.dll和libwinpthread-1.dll放在该目录中。通过添加-static libstdc++和-static libgcc,我可以静态链接前两个。其他三个是否有等效的静态指令?另外,我有静态的lapack libs。我必须指定哪些链接器命令来链接这些命令,以便所有内容都是静态的?如果我添加一个简单的-static,链接器会抱怨它找不到-llapacke,尽管它在那里。

我用LAPACK 3.9.0尝试过。同样的事情,只要我在代码中加入一个LAPACK函数,程序就会终止,没有错误,也没有任何输出。你用的是什么?我很难找到预编译版本。我仍然在使用我的3.6.6版本。我想避免自己编译,我想这可能需要半天的时间来完成一切…我使用的是独立版本的MinGW-w64 GCC 10.2.0,我用CMake+Ninja构建了LAPACK。如果LAPACK对您不起作用,也许您应该尝试OpenBLAS()。好的,使用了mingw发行版,用它和我上面的代码编译了LAPACK,但仍然是相同的行为。我一定是做错了什么。你试过OpenBLAS吗?你不必复制DLL,只要确保它们的位置在
路径
环境变量中即可。对于
.a
您应该将它们的位置添加到环境变量
库路径中。
g++ minimal.cpp -I./Include -LLib -llapacke -o minimal.exe
patch -ulbf LAPACKE/src/lapacke_cgesvdq.c << EOF
@@ -72,4 +72,4 @@
     }
-    liwork = (lapack_int)iwork_query;
-    lcwork = (lapack_int)cwork_query;
+    liwork = iwork_query;
+    lcwork = LAPACK_C2INT(cwork_query);
     lrwork = (lapack_int)rwork_query;
EOF
patch -ulbf LAPACKE/src/lapacke_zgesvdq.c << EOF
@@ -72,4 +72,4 @@
     }
-    liwork = (lapack_int)iwork_query;
-    lcwork = (lapack_int)cwork_query;
+    liwork = iwork_query;
+    lcwork = LAPACK_C2INT(cwork_query);
     lrwork = (lapack_int)rwork_query;
EOF
Hello 1
Hello 2