什么编译标志-static真正意味着gcc

时间:2014-06-07 07:54:46

标签: c++ c gcc

例如我这样做了:

${CROSS_COMPILE}gcc -static myinit.c -o myinit

我也是这样做的,没有静电:

${CROSS_COMPILE}gcc  myinit.c -o myinit

在我的情况下没有效果,在两种情况下二进制都给出相同的结果。

那么静态的作用是什么?

这是我正在编译的程序:

#include <stdio.h>

int
main ()
{
    printf ("\n");
    printf ("Hello world from %s!\n", __FILE__);
    while (1) { }
    return 0;
}

另外

${CROSS_COMPILE}arm-xilinx-linux-gnueabi-

2 个答案:

答案 0 :(得分:1)

在gcc手册页中,它用于强制执行库的静态链接。如果不支持动态链接,某些系统将始终静态链接。

  

-static              在支持动态链接的系统上,这可以防止与共享链接              库。在其他系统上,此选项无效。

       This option will not work on Mac OS X unless all libraries (including libgcc.a)
       have also been compiled with -static.  Since neither a static version of
       libSystem.dylib nor crt0.o are provided, this option is not useful to most
       people.

答案 1 :(得分:1)

$ ldd myinit
    linux-vdso.so.1 =>  (0x00007fff5dbfe000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7ec63ce000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f7ec67c0000)
$ ldd myinit_static 
    not a dynamic executable


$ ll
total 884
drwxrwxr-x  2 jarod jarod   4096 Jun  7 16:00 ./
drwxr-xr-x 38 jarod jarod   4096 Jun  7 15:59 ../
-rwxrwxr-x  1 jarod jarod   8567 Jun  7 16:00 myinit*
-rw-rw-r--  1 jarod jarod    136 Jun  7 16:00 myinit.c
-rwxrwxr-x  1 jarod jarod 877388 Jun  7 16:00 myinit_static*

-static链接所有依赖关系静态,因此您的二进制文件可以在没有安装所有这些运行时的机器上运行