4

我按照下面的网页在 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

之后,我尝试在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);
}

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

cd lapack-3.4.2
cp make.inc.example make.inc
cd lapacke
make 

然后,我终于有了 iblapacke.a,所以我编译了上面的示例:

g++ test3.cpp liblapacke.a -o test3.exe  

我收到以下错误:

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_'

谷歌后,我发现: 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 

有一个函数 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

我想我应该尽量避免在构建 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_,同样的链接错误!!

4

4 回答 4

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

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

于 2013-12-27T02:09:27.840 回答
1

我遇到了同样的问题(使用 g++),但通过添加 -lblas 和 -lgfortran 解决了我的问题。

于 2013-08-15T02:01:42.857 回答
1

我有同样的问题。您需要执行以下操作:

gcc(or g++) -c -O3 -I ../include -o test.o test.c

接着

gfortran test.o ../liblapacke.a ../liblapack.a ../blas.a -o test.exe

然后你可以像这样运行它:

./test.exe

基本上,您需要使用 gfortran 编译来遵循 gcc 编译。第一个命令中的 -c 选项强制 gcc 跳过链接器。然后使用 gfortran 链接库。

您可以通过查看 LAPACKE 提供的示例的 makefile 来了解更多信息。

于 2013-05-12T16:02:36.113 回答
1

为了解决这个问题,这是我已经完成的步骤。

  1. sudo apt-get install libblas-dev liblapack-dev gfortran
  2. 链接 a-lblas-lgfortran它何时运行
于 2019-05-13T11:55:17.153 回答