未定义引用“ log2f@GLIBC_2.27”未定义引用“ logf@GLIBC_2.27”

时间:2019-07-23 00:52:35

标签: lm lapack math.h

我正在尝试从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

2 个答案:

答案 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 许可消息静音。

哦,最后一件事:不要忘记将您的许可证文件复制到您的主目录! :-)