3

所以也许这是我在链接和编译方面暴露我的天真。

我正在尝试编译一些 Fortran 代码,以便它可以作为独立的二进制文件运行。一个问题(在几个问题中)是我想在一个带有 GLIBC 2.14 的系统上编译,但在一个带有 2.11 的系统上运行。是否可以在 GLIBC 等库中静态链接,或者由于库的大小而这不可能?

我的Makefileuses -static-static-libgcc-static-libgfortranflags 以及以下编译器标志

-c -cpp -fall-intrinsics -ffpe-trap=invalid,zero -std=f2003

但是,当我在输出上使用 ldd 时,我得到

linux-vdso.so.1 =>  (0x00007fff13b63000)
libgfortran.so.3 => /usr/lib64/libgfortran.so.3 (0x00007febfd7cf000)
libm.so.6 => /lib64/libm.so.6 (0x00007febfd578000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007febfd362000)
libquadmath.so.0 => /usr/lib64/libquadmath.so.0 (0x00007febfd12c000)
libc.so.6 => /lib64/libc.so.6 (0x00007febfcd9c000)
/lib64/ld-linux-x86-64.so.2 (0x00007febfdae7000)

更新

我正在编译的机器正在运行 openSUSE 12.2:

Linux 3.4.33-2.24-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux

虽然我尝试执行的机器是 openSUSE 11.4:

Linux 2.6.37.6-24-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux

更新 2

我已经重新编写了makefile,并且我正在尝试使用ifort(intel 编译器)进行编译,因为它提供了减少一些依赖关系的静态intel 标志。

我的 ldd 输出现在是

linux-vdso.so.1 =>  (0x00007fff381ff000)
libm.so.6 => /lib64/libm.so.6 (0x00007f89b07cf000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f89b05b2000)
libc.so.6 => /lib64/libc.so.6 (0x00007f89b0222000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f89b001e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f89b0a26000)

使用以下编译器标志

FCFLAGS = -cpp -static-intel -static-libgcc

问题是如果我只做-static(或-static-intel -static)然后我得到

ld: cannot find -lm
ld: cannot find -lpthread
ld: cannot find -lc
ld: cannot find -ldl
ld: cannot find -lc
make: *** [IDP] Error 1

我相信这是因为我的系统上没有这些库的静态版本

更新 3

我还尝试了在库中提供共享对象的方法(如 [this post] 所建议的)(https://stackoverflow.com/a/3214232/615257),但这只是分段错误。

4

1 回答 1

3

这是一个常见的问题。从 2011 年开始的所有后续发行版都没有 64 位库的静态版本。它们附带 32 位版本,但不附带 64 位版本。您只需要使用 libm、libc 等的共享库版本。

于 2013-06-16T07:21:25.333 回答