0

gsl(gnu Scientific Library)のcblas部分の実行に問題があります。

以下の例(gslマニュアルから)はリンクを完全にコンパイルしますが、実行時にエラーが発生します。これはUbuntu12.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-getremovebinutils-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ファイルも同じです。これは、同じバージョンの2つの更新されたシステムで予想されます。

おそらくリンカーは違うのでしょうか?

私の「問題システム」について:

ld -v GNUゴールド(Ubuntu2.22用のGNUBinutils)1.11

「良いシステム」について:

ld -v GNU ld(Ubuntu用のGNU Binutils)2.22

binutils goldを削除し、テストプログラムを再コンパイルすると、成功します。

結論:リンカーの問題、解決済み。

于 2013-01-19T11:57:07.427 に答える