2

我正在尝试使用PARDISO编译线性系统求解器。测试用例 (pardiso_sym.c) 也是从上面的同一网站下载的。

我在目录中有以下文件:

[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

在这里,我从开头删除了“lib”,从 -lpardiso_GNU_IA64 的末尾删除了“.so”

于 2009-08-07T03:30:10.893 回答
2

编辑:对于新的错误,你需要 -lapack 之后的 -lg2c (fortran 兼容性库)

EDIT2:还添加 -lgfortran 和您可能需要的任何其他内容。谷歌搜索丢失的符号通常会找到它包含的库​​的提及。继续一一添加库,直到满足所有依赖项。

所以在你的情况下,例程是这样的:

链接的 lapack - 从 g2c 获得未解析的符号

添加 g2c -- 从 gfortran 获取符号

添加了 gfortran - 获得了一些其他符号,查找它们并一一添加库。

Libray 的顺序很重要,例如,如果您在 lapak 之前包含 g2c,链接器将在知道 lapak 需要它们之前丢弃所有符号(MS 链接器执行 2 次传递来修复该问题)。因此,如果您在已包含的库中看到缺少的符号,请查看哪个库需要它并将带有该符号的库移动到它之后。

于 2009-08-07T03:57:34.163 回答