2014-06-07 36 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鏈接的所有依賴靜態,所以你可以二進制的機器上沒有所有這些運行運行安裝