2013-06-11 31 views
2

所以也许这是我暴露我的天真在链接和编译方面。静态链接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),但它只是分段错误(由[此篇]所建议的)。

+1

由于授权问题,“glibc”的静态连接可能不可行 - 他们要确保你的程序的任何用户都有能力使用他们自己选择的另一个库。 –

+0

是的 - 我开始认为情况可能如此。困难的是,这实际上不是我的代码,所以我现在正在重写Makefile以查看是否存在忽略标志的问题。 – Alex

+1

什么操作系统? –

回答

2

这是一个常见问题。从2011年起,所有后来的发行版都没有静态版本的64位库。它们随附32位版本,但不包含64.您只需使用libm,libc等共享lib版本。

+0

-1我目前最新的OpenSuSE(使用该版本)包含这一点。 –

+0

@VladimirF你从哪里得到它的?我可以从网上找到关于如何获得静态库的信息。 – Alex

+0

从包管理器中,打包'glibc-devel-static'。 http://software.opensuse.org/package/glibc-devel-static –