如何在 LAPACK 和外部头文件中使用 gcc?

ker*_*nic 5 c

我正在尝试运行一个 C 程序,该程序使用带有 LAPACK 和 LBLAS 库的外部头文件,每次当我尝试运行该程序时,我都会收到错误 lapack not found,我如何正确使用这些库来运行该程序。

ubu@sanjay-pc:~$ ./code
*** glibc detected *** ./code: free(): invalid next size (normal): 0x08f64eb8 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb6cf4ee2]
/usr/lib/libblas.so.3gf(ATL_dtrsmKLUNN+0x603)[0xb6ad8973]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:0c 697362     /home/ubu/code
0804a000-0804b000 r--p 00001000 08:0c 697362     /home/ubu/code
0804b000-0804c000 rw-p 00002000 08:0c 697362     /home/ubu/code
08f30000-08f72000 rw-p 00000000 00:00 0          [heap]
b57cb000-b57cc000 ---p 00000000 00:00 0 
b57cc000-b5fcc000 rw-p 00000000 00:00 0 
b5fcc000-b5fcd000 ---p 00000000 00:00 0 
b5fcd000-b67ce000 rw-p 00000000 00:00 0 
b67ce000-b6840000 r-xp 00000000 08:0c 5026       /usr/lib/i386-linux-gnu/libquadmath.so.0.0.0
b6840000-b6841000 r--p 00071000 08:0c 5026       /usr/lib/i386-linux-gnu/libquadmath.so.0.0.0
b6841000-b6842000 rw-p 00072000 08:0c 5026       /usr/lib/i386-linux-gnu/libquadmath.so.0.0.0
b6842000-b6843000 rw-p 00000000 00:00 0 
b6843000-b685a000 r-xp 00000000 08:0c 689952     /lib/i386-linux-gnu/libpthread-2.15.so
b685a000-b685b000 r--p 00016000 08:0c 689952     /lib/i386-linux-gnu/libpthread-2.15.so
b685b000-b685c000 rw-p 00017000 08:0c 689952     /lib/i386-linux-gnu/libpthread-2.15.so
b685c000-b685e000 rw-p 00000000 00:00 0 
b685e000-b687a000 r-xp 00000000 08:0c 656309     /lib/i386-linux-gnu/libgcc_s.so.1
b687a000-b687b000 r--p 0001b000 08:0c 656309     /lib/i386-linux-gnu/libgcc_s.so.1
b687b000-b687c000 rw-p 0001c000 08:0c 656309     /lib/i386-linux-gnu/libgcc_s.so.1
b687c000-b697a000 r-xp 00000000 08:0c 10434      /usr/lib/i386-linux-gnu/libgfortran.so.3.0.0
b697a000-b697b000 r--p 000fe000 08:0c 10434      /usr/lib/i386-linux-gnu/libgfortran.so.3.0.0
b697b000-b697c000 rw-p 000ff000 08:0c 10434      /usr/lib/i386-linux-gnu/libgfortran.so.3.0.0
b697c000-b697d000 rw-p 00000000 00:00 0 
b697d000-b6c4e000 r-xp 00000000 08:0c 41489      /usr/lib/atlas-base/atlas/libblas.so.3gf.0
b6c4e000-b6c52000 rw-p 002d1000 08:0c 41489      /usr/lib/atlas-base/atlas/libblas.so.3gf.0
b6c52000-b6c7c000 r-xp 00000000 08:0c 690058     /lib/i386-linux-gnu/libm-2.15.so
b6c7c000-b6c7d000 r--p 00029000 08:0c 690058     /lib/i386-linux-gnu/libm-2.15.so
b6c7d000-b6c7e000 rw-p 0002a000 08:0c 690058     /lib/i386-linux-gnu/libm-2.15.so
b6c7e000-b6c7f000 rw-p 00000000 00:00 0 
b6c7f000-b6e23000 r-xp 00000000 08:0c 691765     /lib/i386-linux-gnu/libc-2.15.so
b6e23000-b6e25000 r--p 001a4000 08:0c 691765     /lib/i386-linux-gnu/libc-2.15.so
b6e25000-b6e26000 rw-p 001a6000 08:0c 691765     /lib/i386-linux-gnu/libc-2.15.so
b6e26000-b6e29000 rw-p 00000000 00:00 0 
b6e29000-b75f0000 r-xp 00000000 08:0c 41490      /usr/lib/atlas-base/atlas/liblapack.so.3gf.0
b75f0000-b75f4000 rw-p 007c6000 08:0c 41490      /usr/lib/atlas-base/atlas/liblapack.so.3gf.0
b75f4000-b7701000 rw-p 00000000 00:00 0 
b7719000-b771c000 rw-p 00000000 00:00 0 
b771c000-b771d000 r-xp 00000000 00:00 0          [vdso]
b771d000-b773d000 r-xp 00000000 08:0c 689978     /lib/i386-linux-gnu/ld-2.15.so
b773d000-b773e000 r--p 0001f000 08:0c 689978     /lib/i386-linux-gnu/ld-2.15.so
b773e000-b773f000 rw-p 00020000 08:0c 689978     /lib/i386-linux-gnu/ld-2.15.so
bfc14000-bfc35000 rw-p 00000000 00:00 0          [stack]
Aborted
Run Code Online (Sandbox Code Playgroud)

sou*_* c. 12

您需要安装lapacklibblas

sudo apt-get install build-essential
sudo apt-get install liblapack*
sudo apt-get install libblas*
Run Code Online (Sandbox Code Playgroud)

真正的技巧在于调用库函数并链接它们。

拉帕克

标题

不需要特殊的标题,只有普通的标题会在那里。

#include <stdio.h>
#include <math.h>
Run Code Online (Sandbox Code Playgroud)

函数原型和函数调用

所有函数_在声明原型和调用时都应该附加下划线()。这很重要。说我要调用一个函数zheev从LAPACK。它的原型应该是这样的,

extern void zheev_( char* jobz, char* uplo, int* n, dcomplex* a, int* lda,
            double* w, dcomplex* work, int* lwork, double* rwork, int* info );
Run Code Online (Sandbox Code Playgroud)

在终端中链接并运行代码

$ gcc code.c -o code -llapack -lblas
$ ./code
Run Code Online (Sandbox Code Playgroud)

您需要使用-lm标志来使用数学库。您也可以-Wall用于所有警告。

BLAS

使用blas非常简单。

标题

与其他人一起使用特殊标题,

#include <stdio.h>
#include <cblas.h>
Run Code Online (Sandbox Code Playgroud)

函数调用

只需调用函数,

cblas_dgemv(CblasRowMajor, CblasNoTrans, 3, 3, 1.0, m, 3, x, 1, 0.0, y, 1);
Run Code Online (Sandbox Code Playgroud)

在终端中链接并运行代码

$ gcc code_blas.c -o code_blas -lblas -lm
$ ./code_blas
Run Code Online (Sandbox Code Playgroud)

你可以在这里有一些很好的例子