gcc的静态选项?

时间:2012-01-01 06:40:50

标签: optimization gcc compiler-construction static options

我想知道gcc上的-static选项是做什么的。编译某个应用程序时我需要这个选项,但是当我这样做时,我收到以下错误:

gcc -static -O3 -o prog prog.c
/usr/bin/ld: cannot find -lc
collect2: ld returned 1 exit status

需要安装什么?

GCC版本:

[user@localhost dir]$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.6.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.6.1 20110908 (Red Hat 4.6.1-9) (GCC) 

3 个答案:

答案 0 :(得分:56)

-static选项静态链接程序,换句话说,它不需要在运行时依赖动态库来运行。

要实现静态链接,需要在系统上存在库的存档(.a)版本。所以/usr/lib/libc.a /usr/lib/crt1.o等......

在现代Linux系统上(因为你正在使用red hat):当二进制文件链接在一起时1)通过.o和.a文件将代码放入可执行文件中,或者2)放入对动态库的引用(。所以由/lib/ld-linux.so(或/lib64/ld-linux=x86-64.so)解析的文件总是在一个众所周知的地方。

对于您的特定系统,如果某个程序专门想要创建自己的静态版本,那么您需要安装devel工具的静态版本。您至少需要glibc-static软件包。您可能还需要libstdc ++ - 静态包。

答案 1 :(得分:10)

-static标志强制链接器只接受静态库,而不是任何共享库。

如果要使用-static,则必须确保安装了静态版本的C库,这可能很难找到(大多数系统不再具有静态C库)。或者您必须取消-static的效果。但是,在这个示例中,这会破坏-static的目的,因为链接的唯一库是(隐式)C库。

答案 2 :(得分:-29)

  

我想知道gcc上的-static选项是什么。

只需将-v标记传递给gcc即可查找。请阅读GCC command options及更晚的binutils文档,特别是documentation of ld

假设Linux系统

如果您没有Linux系统,则整个答案无关紧要

我强烈建议您花几个小时来阅读Drepper的How To Write Shared Libraries论文。它详细解释了 dynamic linker 实际做了什么。而且你需要了解这一点,以决定何时你不想使用它,那就是你真的想要一个静态链接。我的强烈意见是,很少有这种情况,但当你真的需要静态链接时(例如sash),你就是无法避免它。





您通常应该避免静态链接您的应用程序(您应该解释为什么您不希望通常的动态链接)。我建议至少动态链接系统库(显着libc) - 如果你绝对想要,你可以静态链接不太常见的库 - 。为什么要静态链接您的应用程序?这通常是一个错误(因为您不会从系统动态库的更新中获利)。特别是来自libc的{​​{3}}设施需要动态库。 功能

您的系统应该已经安装了提供静态libc库的软件包。在Debian上,它是libc-dev包,但我不知道它在RedHat上是什么。

要了解gcc的作用,请将-v标记传递给它 功能

  gcc -v -static -O3 -o prog prog.c

但是如果没有充分的理由,你不应该静态地链接你的程序。在我的Debian发行版中,/usr/bin中有700多个程序,只有一个是静态链接的。

  

我想知道gcc上的-static选项是什么。

关于GCC -static选项的作用,请阅读name service switch。它是Invoking GCC

  

-static

     

在支持动态链接的系统上,这会覆盖-pie并阻止与共享库的链接。在其他系统上,这个   选项无效。

-pie标志表示:

  

-pie

     

在支持它的目标上生成动态链接的位置无关可执行文件。对于可预测的结果,在指定此链接器选项时,还必须指定用于编译的相同选项集(-fpie,-fPIE或模型子选项)。

/usr/bin/ld: cannot find -lc消息令人惊讶,可能会发现其他问题(系统安装错误或损坏,或者某些问题遗失libc.a)。