2

PARDISOを使用して線形システム ソルバーをコンパイルしようとしています。テスト ケース (pardiso_sym.c) も上記の同じ Web サイトからダウンロードします。

ディレクトリ内に次のファイルがあります。

[gv@emerald my-pardiso]$ ls -lh
total 1.3M
-rw-r--r-- 1 gv hgc0746 1.3M Aug  7 11:59 libpardiso_GNU_IA64.so
-rw-r--r-- 1 gv hgc0746 7.2K Nov 13  2007 pardiso_sym.c

次に、次のコマンドでコンパイルを試みます。

[gv@emerald my-pardiso]$ gcc pardiso_sym.c -o pardiso_sym -L . -llibpardiso_GNU_IA64.so -L/home/gv/.boost/include/boost-1_38 -llapack

しかし、次のエラーが発生します。

/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.3.2/../../../../x86_64-unknown-linux-gnu/bin/ld:
cannot find -llibpardiso_GNU_IA64.so
collect2: ld returned 1 exit status

コンパイル方法の何が問題になっていますか?

これは私のシステムの追加情報です:

[gv@emerald my-pardiso]$ uname -a
Linux gw05 2.6.18-92.1.13.el5 #1 SMP Wed Sep 24 19:32:05 EDT 2008
x86_64 x86_64 x86_64 GNU/Linux

[gv@emerald my-pardiso]$ gcc --version
gcc (GCC) 4.3.2

更新

ライブラリは、Dave Gamble の提案を使用して認識されます。しかし、今では別のエラーが発生します:

$ gcc pardiso_sym.c -o pardiso_sym -L . -lpardiso_GNU_IA64 -L/home/gv/.boost/include/boost-1_38 -llapack
./libpardiso_GNU_IA64.so: undefined reference to `s_stop'
./libpardiso_GNU_IA64.so: undefined reference to `s_wsfe'
./libpardiso_GNU_IA64.so: undefined reference to `e_wsfe'
./libpardiso_GNU_IA64.so: undefined reference to `z_abs'
./libpardiso_GNU_IA64.so: undefined reference to `s_cat'
./libpardiso_GNU_IA64.so: undefined reference to `s_copy'
./libpardiso_GNU_IA64.so: undefined reference to `do_fio'
4

2 に答える 2

4

編集: pardiso マニュアルを読みました。修正は次のとおりです。

gcc pardiso_sym.c -o pardiso_sym -L . -lpardiso_GNU_IA64 -L/home/gv/.boost/include/boost-1_38 -llapack

ここでは、-lpardiso_GNU_IA64 の先頭から「lib」を削除し、末尾から「.so」を削除しました。

于 2009-08-07T03:30:10.893 に答える
2

編集:新しいエラーの場合、-lapack の後に -lg2c が必要です (fortran 互換ライブラリ)

EDIT2: -lgfortran と必要なものを追加してください。不足しているシンボルをグーグルで検索すると、通常、含まれているライブラリの言及が見つかります。すべての依存関係が満たされるまで、ライブラリを 1 つずつ追加し続けます。

したがって、あなたの場合、ルーチンは次のようになります。

リンクされた lapack -- g2c から未解決のシンボルを取得しました

g2c を追加 -- gfortran からシンボルを取得

gfortran を追加 -- 他のシンボルをいくつか取得し、それらを調べて、ライブラリを 1 つずつ追加します。

ライブラリの順序は重要です。たとえば、lapak の前に g2c を含めると、リンカは lapak に必要であることを認識する前にすべてのシンボルを破棄します (MS リンカはそれを修正するために 2 つのパスを実行します)。したがって、すでにインクルードしているライブラリに不足しているシンボルがある場合は、どのライブラリがそれを必要としているかを調べ、そのシンボルを含むライブラリをその後に移動します。

于 2009-08-07T03:57:34.163 に答える