链接错误未定义对 Lapack 中“dgels_”的引用

bar*_*hen 4 linux lapack

我按照下面的网页在 linux 中安装 ATLAS + Lapack :

http://math-atlas.sourceforge.net/atlas_install/node6.html

bunzip2 -c atlas3.10.1.tar.bz2 | tar xfm -    # create SRCdir
mv ATLAS ATLAS3.10.1                          # get unique dir name
cd ATLAS3.10.1                                # enter SRCdir
mkdir Linux_C2D64SSE3                         # create BLDdir
cd Linux_C2D64SSE3                            # enter BLDdir
../configure -b 64 -D c -DPentiumCPS=2400 \   # configure command
  --prefix=/home/whaley/lib/atlas \           # install dir
  --with-netlib-lapack-tarfile=/home/whaley/dload/lapack-3.4.2.tgz
make build                                    # tune & build lib
make check                                    # sanity check correct answer
make ptcheck                                  # sanity check parallel
make time                                     # check if lib is fast
make install                                  # copy libs to install dir
Run Code Online (Sandbox Code Playgroud)

之后,我尝试在http://www.netlib.org/lapack/lapacke.html 中运行一个示例

示例代码:

#include <stdio.h>
#include <lapacke.h>

int main (int argc, const char * argv[])
{
   double a[5*3] = {1,2,3,4,5,1,3,5,2,4,1,4,2,5,3};
   double b[5*2] = {-10,12,14,16,18,-3,14,12,16,16};
   lapack_int info,m,n,lda,ldb,nrhs;
   int i,j;
   m = 5;
   n = 3;
   nrhs = 2;
   lda = 5;
   ldb = 5;

   info = LAPACKE_dgels(LAPACK_COL_MAJOR,'N',m,n,nrhs,a,lda,b,ldb);

   for(i=0;i<n;i++)
   {
      for(j=0;j<nrhs;j++)
      {
         printf("%lf ",b[i+ldb*j]);
      }
      printf("\n");
   }
   return(info);
}
Run Code Online (Sandbox Code Playgroud)

我发现构建库没有 iblapacke.a ,所以我通过 myslef 构建了这个库

cd lapack-3.4.2
cp make.inc.example make.inc
cd lapacke
make 
Run Code Online (Sandbox Code Playgroud)

然后,最后我现在有了 iblapacke.a,所以我通过以下方式编译上面的示例:

g++ test3.cpp liblapacke.a -o test3.exe  
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

liblapacke.a(lapacke_dgels_work.o): In function `LAPACKE_dgels_work':
lapacke_dgels_work.c:(.text+0x1dd): undefined reference to `dgels_'
lapacke_dgels_work.c:(.text+0x2b7): undefined reference to `dgels_'
Run Code Online (Sandbox Code Playgroud)

在我谷歌之后,我发现:http : //www.netlib.org/lapack/explore-html/d7/d3b/group__double_g_esolve.html

Functions/Subroutines 
subroutine  dgels (TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO) 
  DGELS solves overdetermined or underdetermined systems for GE matrices 
Run Code Online (Sandbox Code Playgroud)

有一个函数 dgels ,没有下划线,在

http://shtools.ipgp.fr/www/faq.html#l4

我认为加下划线是为了意外,

nm -A liblapacke.a |grep "dgels_"

liblapacke.a:lapacke_dgels.o:                 U LAPACKE_dgels_work
liblapacke.a:lapacke_dgels_work.o:                 U LAPACKE_dge_trans
liblapacke.a:lapacke_dgels_work.o:0000000000000000 T LAPACKE_dgels_work
liblapacke.a:lapacke_dgels_work.o:                 U LAPACKE_xerbla
liblapacke.a:lapacke_dgels_work.o:                 U dgels_
liblapacke.a:lapacke_dgels_work.o:                 U free
liblapacke.a:lapacke_dgels_work.o:                 U malloc
Run Code Online (Sandbox Code Playgroud)

我想我应该尽量避免在构建 liblapack.a 时构建“dgels”而不是“dgels”这样的下划线,这意味着我应该改变一些构建 Lapack 和 ATLAS 的东西,只是不知道该怎么做......任何建议不胜感激!!

更新:http : //software.intel.com/sites/products/documentation/doclib/mkl_sa/11/mkl_lapack_examples/c_bindings.htm

我不知道是否相关,添加了 -Ddgels=dgels_,同样的链接错误!!

小智 5

见:http : //icl.cs.utk.edu/lapack-forum/viewtopic.php?f=12&t=3336

例如:

gcc LinearEquation.c -Ilapack-3.5.0/lapacke/include/ -Llapack-3.5.0 -llapacke -llapack -lrefblas -lgfortran -o LinearEquation
Run Code Online (Sandbox Code Playgroud)

的顺序lapacke > lapack > refblas很重要......另外,如果你不想使用双步gcc gfortran,请使用-lgfortran