gccコンパイル四段階曲


gccコンパイル4ステップ
プリプロセッシング、コンパイル、アセンブリ、リンク
プリプロセッシング
gcc -E 

hello.c —> hello.i
  • マクロ、ヘッダファイル
  • を展開する
  • 置換条件コンパイル
  • 注釈、空白行、空白
  • を削除する.
    コンパイル
    gcc -S
    

    hello.i —> hello.s
    構文仕様の確認
    アセンブル
    gcc -c
    

    hello.s —> hello.oアセンブリ命令をマシンコードに翻訳する
    -oは処理完了後のファイル名を指定します
    リンク
  • データセグメント連結
  • アドレス埋め戻し
  • まとめ
    コンパイルはリソースを消費し、システムリソースが最も多い.
    gccコンパイルパラメータ
    ヘッダファイルディレクトリの指定-Igcc -Iヘッダファイルの場所の指定
    ヘッダファイルhello.h
    #include
    

    ソースファイルhello.cpp
    #include"hello.h"
    int main(){
         
        printf("---");
    }
    
    mkdir inc           #     
    mv hello.h ./inc    #        hello.h   inc  
    g++ hello.cpp -o hello  #     ,  hello.h      
    g++ -I ./inc hello.cpp -o hello #    ,-I           
    
    

    コンパイルのみリンクを生成しません-c
    バイナリファイルを生成するo
    g++ -c hello.cpp
    

    デバッグ-g
    Windowsインタフェースでは、vsを直接使用してデバッグすることができます.
    しかしlinuxではgdbを使用してデバッグされます.デバッグ可能なリンクファイルを生成するには、-g
    g++ -g hello.cpp -o hello
    

    最適化-ON
    n=0~3,nが大きいほど最適化が大きくなる
    Wallすべての警告メッセージを表示
    int main(){
         
        int a = 10;
        int b = 10;         //unused variable        
        printf("----%d"); //      
    }
    

    -D動的登録マクロ
    次の文があるとします
    #include"hello.h"
    
    #ifdef HELLO
    #define HI 20
    #endif
    
    int main(int argc, char *argv[]){
         
        int b = 10;
        int a = 10;
        printf("------%d", HI);
        return 0;
    }
    
    
    g++ hello.cpp -o hello
    #   ,  HI    
    
    g++ hello.cpp -D HELLO -o hello
    
    -D等価#define HELLO#ifdef HELLOに対応して、define HELLOだけがifdefからendifの中の文を実行することができます.
    使用上のメリット:泥棒の多いテスト文を書いたと仮定し、正式にオンラインになったときにテスト文を削除したい場合は、スイッチ#ifdef blablaを作成し、このテスト文を使用したい場合は、マクロを動的に登録すれば、再び使用することができます.