gccコンパイル四段階曲
gccコンパイル4ステップ
プリプロセッシング、コンパイル、アセンブリ、リンク
プリプロセッシング
hello.c —> hello.iマクロ、ヘッダファイル を展開する置換条件コンパイル 注釈、空白行、空白 を削除する.
コンパイル
hello.i —> hello.s
構文仕様の確認
アセンブル
hello.s —> hello.oアセンブリ命令をマシンコードに翻訳する
-oは処理完了後のファイル名を指定します
リンクデータセグメント連結 アドレス埋め戻し まとめ
コンパイルはリソースを消費し、システムリソースが最も多い.
gccコンパイルパラメータ
ヘッダファイルディレクトリの指定-I
ヘッダファイル
ソースファイル
コンパイルのみリンクを生成しません-c
バイナリファイルを生成するo
デバッグ-g
Windowsインタフェースでは、vsを直接使用してデバッグすることができます.
しかしlinuxではgdbを使用してデバッグされます.デバッグ可能なリンクファイルを生成するには、-g
最適化-ON
n=0~3,nが大きいほど最適化が大きくなる
Wallすべての警告メッセージを表示
-D動的登録マクロ
次の文があるとします
使用上のメリット:泥棒の多いテスト文を書いたと仮定し、正式にオンラインになったときにテスト文を削除したい場合は、スイッチ#ifdef blablaを作成し、このテスト文を使用したい場合は、マクロを動的に登録すれば、再び使用することができます.
プリプロセッシング、コンパイル、アセンブリ、リンク
プリプロセッシング
gcc -E
hello.c —> hello.i
コンパイル
gcc -S
hello.i —> hello.s
構文仕様の確認
アセンブル
gcc -c
hello.s —> hello.oアセンブリ命令をマシンコードに翻訳する
-oは処理完了後のファイル名を指定します
リンク
コンパイルはリソースを消費し、システムリソースが最も多い.
gccコンパイルパラメータ
ヘッダファイルディレクトリの指定-I
gcc -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を作成し、このテスト文を使用したい場合は、マクロを動的に登録すれば、再び使用することができます.