2014-06-07 31 views
-1

比如我这样做:什么编译标志 - 静态的真正含义海合会

${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-

+0

你做标记用C++了。你是否用g ++和一个小型C++程序进行测试,或者这与C++无关? – stefan

+0

@stefan对不起,我没有用g ++来测试它。如果您认为这只是C特定的,请编辑。 – user2799508

+0

@ user12799508我问过,因为语言有很大差异。这并不意味着编译器标志的行为不同,但是您应该始终用您感兴趣的语言标记。 – stefan

回答

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
$ 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链接的所有依赖静态,所以你可以二进制的机器上没有所有这些运行运行安装