0

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

2 回答 2

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
$ 
于 2013-01-18T19:26:29.910 回答
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 并编译它。瞧,同一个程序在使用相同的编译器开关编译后运行!

  • 比较 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并重新编译测试程序,并且..成功!

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

于 2013-01-19T11:57:07.427 回答