参考链接:
1、http://forum.ubuntu.org.cn/viewtopic.php?t=297486
全部代码下载链接:https://download.csdn.net/download/xiaoxiao133/10813013
测试环境:Ubuntu18.04
编译之前安装gcc:sudo apt-get install gcc(有问题请搜索百度)
make编译虽然可能有错误但是可以生成库暂时不管:
当我们下载了CLAPCAK库编译好之后,使用test.c测试出现一下问题:
dgesvd.c undefined reference to f2c_dgemm' ./liblapack_LINUX.a(dgesvd.o): In functiondgesvd_’:
dgesvd.c:(.text+0x3cf8): undefined reference to f2c_dgemm' dgesvd.c:(.text+0x40f7): undefined reference tof2c_dgemm’
dgesvd.c:(.text+0x5327): undefined reference to f2c_dgemm' dgesvd.c:(.text+0x57d0): undefined reference tof2c_dgemm’
dgesvd.c:(.text+0x6ab2): undefined reference to `f2c_dgemm’
说明我们gcc时候编译库的库目录、命名和顺序有问题。
操作步骤:
1、拷贝文件重命名。拷贝lapack_LINUX.a, blas_LINUX.a, libf2c.a到 /usr/local/lib然后重命名为 liblapack.a, libblas.a, libf2c.a.
2、 增加环境变量路径。将**/usr/local/lib**写到~/.bashrc里面
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib。如下图:
3、source 生效.bashrc。使用命令sudo source ~/.bashrc和sudo ldconfig
4、编译和运行test.c
正确编译如下 库顺序不能变:
在cmakelist里面也是一样:target_link_libraries(myProject lapack blas f2c m)
gcc -Wall -o test2 test.c -I./INCLUDE -L. -llapack -lblas -lf2c -lm
test.c代码如下:
#include <stdio.h>
#include "./INCLUDE/f2c.h"
#include "./INCLUDE/clapack.h"
#include "./INCLUDE/blaswrap.h"
#define SIZE 4
void test1()
{
char transa = 'T', transb = 'T';
integer M = 2, N = 2, K = 2, LDA = K, LDB = N, LDC = M;
double alpha = 1.0, A[4] = { 1, 2, 3, 4}, B[4] = { 5, 6, 7, 8 }, beta = 0.0, C[4];
dgemm_(&transa, &transb, &M, &N, &K, &alpha, A, &LDA, B, &LDB, &beta, C, &LDC);
printf("C[0]=%lf,C[1]=%lf,C[2]=%lf,C[3]=%lf:", C[0],C[1],C[2],C[3]);
printf("\n");
return;
}
void test2()
{
char JOBU;
char JOBVT;
int i;
//数据类型integer是fortran里的。这里在C++下可以使用的原因是f2c.h文件中已经作了定义
integer M = SIZE;
integer N = SIZE;
integer LDA = M;
integer LDU = M;
integer LDVT = N;
integer LWORK;
integer INFO;
integer mn = min( M, N );
integer MN = max( M, N );
double a[SIZE*SIZE] = { 16.0, 5.0, 9.0 , 4.0, 2.0, 11.0, 7.0 , 14.0, 3.0, 10.0, 6.0, 15.0, 13.0, 8.0, 12.0, 1.0};
double s[SIZE];
double wk[201];
double uu[SIZE*SIZE];
double vt[SIZE*SIZE];
JOBU = 'A';
JOBVT = 'A';
LWORK = 201;
dgesvd_( &JOBU, &JOBVT, &M, &N, a, &LDA, s, uu, &LDU, vt, &LDVT, wk, &LWORK, &INFO);
printf("INFO=%d \n", 1 );
for ( i= 0; i< SIZE; i++ ) {
printf("s[ %d ] = %f\n", i, s[ i ] );
}
}
int main()
{
test1();
test2();
return 0;
}