我正在尝试使用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'
答案 0 :(得分:2)
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”
答案 1 :(得分:2)
编辑: 对于新错误,在-lapack(fortran兼容库)之后需要-lg2c
EDIT2: 还要添加-lgfortran以及您可能需要的任何其他内容。谷歌搜索丢失的符号通常会发现它包含的库。继续逐一添加库,直到满足所有依赖关系。
所以在你的情况下例程是这样的:
链接lapack - 从g2c获得未解析的符号
添加了g2c - 来自gfortran的符号
添加了gfortran - 获得了一些其他符号,查找它们并逐个添加库。
Libray命令很重要,例如,如果你在lapak之前包含g2c,链接器会在它知道lapak需要它们之前抛弃它的所有符号(MS链接器确实需要2次传递才能解决)。因此,如果您看到已经包含的lib中缺少的符号,请查看哪个库需要它,并将符号移动到lib之后。