所以也许这是我暴露我的天真在链接和编译方面。静态链接64位glibc库到二进制
我想编译一些Fortran代码,使它可以作为独立的二进制文件运行。一个问题(其中一个问题)是我想在一个使用GLIBC 2.14的系统上进行编译,但在2.11上运行。是否有可能在像GLIBC这样的库中进行静态链接,或者由于库的大小而不可能这样做?
我Makefile
使用-static
,-static-libgcc
和-static-libgfortran
标志和下面的编译器标志
-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)
更新
我正在编译的机器是runnin摹的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编译器)进行编译,因为它提供了可以减少一些依赖关系的static-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
我相信这是因为我没有这些lib的静态版本在我的系统
UPDATE 3
上raries我还试图在库中提供共享对象的方法(https://stackoverflow.com/a/3214232/615257),但它只是分段错误(由[此篇]所建议的)。
由于授权问题,“glibc”的静态连接可能不可行 - 他们要确保你的程序的任何用户都有能力使用他们自己选择的另一个库。 –
是的 - 我开始认为情况可能如此。困难的是,这实际上不是我的代码,所以我现在正在重写Makefile以查看是否存在忽略标志的问题。 – Alex
什么操作系统? –