gnu scientific library(cblas)符号查找错误

时间:2013-01-18 18:48:59

标签: c gsl

我在运行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;
 }

2 个答案:

答案 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并且看到,在使用相同的编译器开关编译后运行相同的程序!

  • 比较gcc的版本表明它们在两个系统上完全相同(gcc版本4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5))。
  • 安装的gsl.so文件也是相同的,预计会有两个相同版本的更新系统。

也许链接器不同?

在我的'问题系统'上:

  

ld -v   GNU gold(Ubuntu 2.22的GNU Binutils)1.11

关于'好系统':

  

ld -v   GNU ld(Ubuntu的GNU Binutils)2.22

删除binutils gold并重新编译测试程序,并成功!

底线:链接器问题,已解决。