gcc的静态选项?

sj7*_*755 25 compiler-construction optimization static gcc options

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

gcc -static -O3 -o prog prog.c
/usr/bin/ld: cannot find -lc
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

什么需要安装?

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) 
Run Code Online (Sandbox Code Playgroud)

Ahm*_*sud 61

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

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

在现代Linux系统上(当你使用红帽时):当二进制文件链接在一起时1)要么通过.o和.a文件将代码放入可执行文件中,要么2)放入对动态库(.so)文件的引用这是由/lib/ld-linux.so(或/lib64/ld-linux=x86-64.so)解决的,它始终位于众所周知的地方.

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


Jon*_*ler 11

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

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

  • 是否有任何特殊原因不能简单地让链接器静态附加来自链接器可用的任何库的代码?即使代码中的引用被格式化为必须在运行时解析,我认为应该可以将适当的例程附加到可执行文件,并修补引用以便它们指向可执行文件中的代码. (2认同)
  • 即使代码最终必须动态加载,我建议已安装的应用程序默认情况下每个都应该接收他们自己的大多数库的副本。如果需要升级库,可以通过让操作系统为每个程序保留一个“升级设置”来处理[例如,如果使用 FooLib 1.7 的程序注意到安装了“FooLib 1.8”,它可以允许用户使用 1.7 或 1.8 运行它并将选择保存为默认值]。这样,如果程序有 FooLib 相关的问题,用户可以升级它,但事情不会自发改变。 (2认同)
  • 我想知道为什么系统没有在他们的程序执行基础设施中管理这样的功能?正如有人在另一条评论中指出的那样,链接器在 1980 年代很烦人,并且在 30 多年后仍然很烦人。他们有什么理由应该这样做吗? (2认同)
  • 如果您实现它,也许它将被使用。共享库的优点是您可以更改共享库,并且所有自动使用的应用程序都可以从新版本中的错误修复中受益。静态链接的优点是您不必担心共享库管理,并且除非重新构建,否则应用程序不会更改。如果您采用静态链接路线,则会导致内存使用量增加(每个不同的可执行文件都有其自己的共享代码副本),但您知道程序不会意外更改。 (2认同)