参考链接:
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编译虽然可能有错误但是可以生成库暂时不管:

【CLAPACK函数库】CLAPACK安装与使用,编译好了出现f2c_dgemm,dgesvd_错误主要是camkelist, gcc编译库的顺序要对

当我们下载了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.
【CLAPACK函数库】CLAPACK安装与使用,编译好了出现f2c_dgemm,dgesvd_错误主要是camkelist, gcc编译库的顺序要对

2、 增加环境变量路径。将**/usr/local/lib**写到~/.bashrc里面
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib。如下图:
【CLAPACK函数库】CLAPACK安装与使用,编译好了出现f2c_dgemm,dgesvd_错误主要是camkelist, gcc编译库的顺序要对
3、source 生效.bashrc。使用命令sudo source ~/.bashrcsudo 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;
}

【CLAPACK函数库】CLAPACK安装与使用,编译好了出现f2c_dgemm,dgesvd_错误主要是camkelist, gcc编译库的顺序要对【CLAPACK函数库】CLAPACK安装与使用,编译好了出现f2c_dgemm,dgesvd_错误主要是camkelist, gcc编译库的顺序要对

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-01-11
  • 2022-03-05
  • 2021-11-02
  • 2022-12-23
  • 2022-01-07
  • 2021-12-26
猜你喜欢
  • 2021-09-11
  • 2021-08-21
  • 2022-01-18
  • 2021-11-23
  • 2022-12-23
  • 2021-08-27
相关资源
相似解决方案