我正在尝试从pardiso网站运行示例代码,但最终出现此错误。 我从http://www.netlib.org/lapack/
安装了lapack软件包gcc pardiso_sym.c -L /home/sree/ -lpardiso600-GNU800-X86-64 -llapack -lgfortran -fopenmp -lm -ldl
错误:
/home/sree//libpardiso600-GNU800-X86-64.so: undefined reference to `log2f@GLIBC_2.27'
/home/sree//libpardiso600-GNU800-X86-64.so: undefined reference to `logf@GLIBC_2.27'
collect2: error: ld returned 1 exit status
答案 0 :(得分:1)
我知道这个问题已经很老了,但是无论如何:
首先-您遇到的错误是链接器错误,并且似乎无法解析对glibc中定义的函数的引用。
此处为glibc(GNU C library)提供的版本为2.27。
我现在怀疑尝试编译pardiso_sym.c时GCC使用的版本低于glibc的指定版本-因此出现错误。
您可以找到一个不错的线程来检查不同gcc编译器here使用的glibc版本。
也就是说-不同的gcc编译器可能使用不同版本的glibc进行链接。现在,您可以专门尝试并链接适当版本的glibc(like described here),或者-可能更可行的方法是-try和update your glibc version。
所描述的pardiso软件包也使用gcc 8.0进行了编译,但是有可用gcc 7.2编译的pardiso版本。这两个版本还链接了不同的glibc版本,并且使用libpardiso600-GNU729-X86-64.so可能已经可行。 另外,我还将使用比用于编译pardiso的版本更高的gcc版本,因此您可能也希望升级gcc。
答案 1 :(得分:1)
正如所承诺的,这里是我所学到的总结:
Pardiso 库(与所有共享库一样)会记住编译时使用的 glibc
版本。有时,系统上的 glibc
可能比 Pardiso 预期的要旧,从而导致 OP 描述的链接错误。您可以通过运行 glibc
来检查 ldd --version
的版本。
我申请了一个免费的限时学术许可,这给了我一个个人下载链接。正如@Flusslauf 所指出的,Linux 64 位平台可以选择 2 个版本。截至今天(2021-03-03),我可以使用的两个版本是:libpardiso600-GNU720-X86-64.so
(注意:GNU720
而不是 GNU729
,但这是一个细微差别)和 {{1} }.由于上述原因,后者对我不起作用。于是我在包含原Pardiso库的目录下从Pardiso网站编译了一个小示例程序如下:
libpardiso600-GNU800-X86-64.so
cd /path/to/pardiso
gcc pardiso_sym.c -L/usr/lib64 -L. -lpardiso600-GNU720-X86-64 \
-llapack -lblas -fopenmp -lpthread -lm -ldl -o psym
export LD_LIBRARY_PATH=/path/to/pardiso:${LD_LIBRARY_PATH}
export OMP_NUM_THREADS=2
export PARDISOLICMESSAGE=1
./psym
是在我使用的机器上找到 LAPACK 和 BLAS 所必需的。 -L/usr/lib64
告诉 GCC 在当前目录(-L.
我编译测试程序的位置)中查找 Pardiso 库。编译后,将 Pardiso 库位置添加到 /path/to/pardiso
,请求 2 个 OpenMP 线程并使 Pardiso 许可消息静音。
哦,最后一件事:不要忘记将您的许可证文件复制到您的主目录! :-)