如何判断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
我正在尝试使用 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