我在运行gsl(gnu科学库)的cblas部分时遇到问题。
以下示例(来自gsl手册)完美地编译链接,但在运行时出错。这是在Ubuntu 12.04下。
gcc linsys.c -lgsl -lcblas -lm
./ a.out:符号查找错误:/usr/lib/libgsl.so.0:未定义符号:cblas_dtrsv
#include <stdio.h>
#include <gsl/gsl_linalg.h>
int
main (void)
{
double a_data[] = { 0.18, 0.60, 0.57, 0.96,
0.41, 0.24, 0.99, 0.58,
0.14, 0.30, 0.97, 0.66,
0.51, 0.13, 0.19, 0.85 };
double b_data[] = { 1.0, 2.0, 3.0, 4.0 };
gsl_matrix_view m
= gsl_matrix_view_array (a_data, 4, 4);
gsl_vector_view b
= gsl_vector_view_array (b_data, 4);
gsl_vector *x = gsl_vector_alloc (4);
int s;
gsl_permutation * p = gsl_permutation_alloc (4);
gsl_linalg_LU_decomp (&m.matrix, p, &s);
gsl_linalg_LU_solve (&m.matrix, p, &b.vector, x);
printf ("x = \n");
gsl_vector_fprintf (stdout, x, "%g");
gsl_permutation_free (p);
gsl_vector_free (x);
return 0;
}
答案 0 :(得分:1)
在我的ubuntu系统上,库名称为gslcblas
,完整路径为/usr/lib/libgslcblas.so
。我在这个库中尝试了你的代码并编译:
gcc gl.c -lgsl -lgslcblas -lm
你能检查一下你是否有这个库并用它编译吗?如果没有,您也可以安装它:
sudo apt-get install libgsl0-dev
图书馆链接和输出:
$ ldd a.out
linux-gate.so.1 => (0xb771d000)
libgsl.so.0 => /usr/lib/libgsl.so.0 (0xb74e5000)
libgslcblas.so.0 => /usr/lib/libgslcblas.so.0 (0xb74a7000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb72fc000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb72d0000)
/lib/ld-linux.so.2 (0xb771e000)
$ ./a.out
x =
-4.05205
-12.6056
1.66091
8.69377
$
答案 1 :(得分:0)
@KingsIndian。非常感谢您的输出,这有助于我找到并解决这个恼人的问题。
解决方案:'apt-get remove binutils-gold'并重新编译/链接。
原因:ld.gold不会添加libgslcblas,而标准的linke会这样做。
我的可执行文件的ldd输出:
> ldd a.out
> linux-vdso.so.1 => (0x00007fffb67ff000)
> libgsl.so.0 => /usr/lib/libgsl.so.0 (0x00007f0819468000)
> libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f08190a9000)
> libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0818dac000)
> /lib64/ld-linux-x86-64.so.2 (0x00007f08198cd000)
我们看到了libgslcblas的明显遗漏!我将我的代码复制到另一个ubuntu系统(也运行12.04.1 lts并编译它.Lo并且看到,在使用相同的编译器开关编译后运行相同的程序!
也许链接器不同?
在我的'问题系统'上:
ld -v GNU gold(Ubuntu 2.22的GNU Binutils)1.11
关于'好系统':
ld -v GNU ld(Ubuntu的GNU Binutils)2.22
删除binutils gold并重新编译测试程序,并成功!
底线:链接器问题,已解决。