如何判断lgfortran指向的库

How to determine the library pointed to by lgfortran

我正在尝试使用 GNU make 为 C++ 和 Fortran 编译构建。在某些机器上构建工作正常,在其他机器上我收到错误 undefined reference to '_gfortran_stop_numeric_f08'。我认为 fortran 库存在一些问题,我正在尝试解决这个问题。

在编译工作的机器上,gfortran 版本是“GNU Fortran (SUSE Linux) 4.8.5”。在 /usr/lib64/ 中,我有以下库文件:

libgfbgraph-0.2.so.0 libgfortran.so.3 libgfortran.so.4 libgfbgraph-0.2.so.0.0.0 libgfortran.so.3.0.0 libgfortran.so.4.0.0

在这些机器上,使用 LDFlag -lgfortran 编译工作正常。但是,使用 -L/usr/lib64/libgfortran.so.4-L/usr/lib64/libgfortran.so.3 编译会给出一长串错误,形式为

/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: io.f90:(.text+0x888d): undefined reference to `_gfortran_st_write'

看来使用标志 -lgfortran 我既没有指向 -L/usr/lib64/libgfortran.so.4 也没有指向 -L/usr/lib64/libgfortran.so.3。如何找出实际指向的库?

在其他机器上,即使使用标志 -lgfortran 编译也不起作用。这是我收到错误 undefined reference to '_gfortran_stop_numeric_f08' 的地方。在这些机器上,gfortran 版本是 GNU Fortran (SUSE Linux) 7.5.0"。在 /usr/lib64/ 中,我有以下库文件:

libgfortran.so.4 libgfortran.so.4.0.0

关于如何解决这个问题有什么想法吗?

提供 -lgfortran 时 link 的库将始终是 libgfortran.so。最常见的是,这是一个实际文件的符号 link,稍后将被编译的二进制文件引用。

现在,由于这是一个编译器提供的库,它的位置可以通过调用编译器来确定,例如:

# Custom compiler
$ gfortran --version
GNU Fortran (GCC) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.

$ gfortran --print-file libgfortran.so
/proj/subcm/tools/Linux-x86_64/Santiago/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib64/libgfortran.so

$ readlink -f $(gfortran --print-file libgfortran.so)
/proj/subcm/tools/Linux-x86_64/Santiago/lib64/libgfortran.so.5.0.0


# Stock distribution compiler
$ /usr/bin/gfortran --version
GNU Fortran (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.

$ /usr/bin/gfortran --print-file libgfortran.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/libgfortran.so

$ readlink -f $(/usr/bin/gfortran --print-file libgfortran.so)
/usr/lib64/libgfortran.so.3.0.0