我按照以下网页在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的东西, 只是不知道该怎么做....任何建议都表示赞赏!!
我不知道是否相关,-Ddgels = dgels_被添加,相同的链接错误!!
答案 0 :(得分:1)
请参阅: 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
答案 1 :(得分:0)
我遇到了完全相同的问题。您需要按以下方式执行此操作:
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了解更多信息。
答案 2 :(得分:0)
我有同样的问题(使用g ++),但通过添加-lblas和-lgfortran解决了我的问题。
答案 3 :(得分:0)
要解决此问题,请按以下步骤操作。
sudo apt-get install libblas-dev liblapack-dev gfortran
-lblas
和-lgfortran