gcc [option] file...
preprocessing compilation assembly linking
.c(with macros)--->.c(without macros)--->assembler input file--->object file--->executable file
-E, -S, -c 告訴在編譯哪一個階段中止。
-E 在執行 preprocessing 後中止,產生標準輸出。
-S 在執行 compilation 後中止,產生 .s 文件。
-c 在執行 assembly 後中止,產生 .o 文件。
-std 指定編譯器使用的標準。經常使用標準:c90, c89(就是c90), c99, gnu90(default), gnu99, c++98, gnu++98。示例:-std=c90。
-ansi for C code 等價 -std=c90。-ansi for C++ code 等價 -std=c++98。
-pedantic Issue all the warnings demanded by strict ISO C and ISO C++;
reject all programs that use forbidden extensions, and some other programs that do not follow ISO C and ISO C++.
需配合 -std 或 -ansi 使用。
-g 添加標準調試信息。另外一個選項 -ggdb,添加對 gdb 更友好的調試信息。
-pg 當想使用性能分析工具 gprof 時,須要添加該選項。
-O 優化(Optimize)。經常使用可選值:-O0(default), -O1(等價 -O), -O2(通常使用的優化級別), -O3, -Os(針對空間優化)。
-Wall 開啓全部提醒。-Werror 把提醒看成錯誤。
-I 添加 include 目錄。
-L 添加 lib 目錄。
-l 將庫文件添加到連接過程當中,默認是連接 shared libraries。下面是爲何把 -l 放到命令行最後的緣由。
It makes a difference where in the command you write this option;
the linker searches and processes libraries and object files in the
order they are specified. Thus, foo.o -lz bar.o searches library z
after file foo.o but before bar.o. If bar.o refers to functions in
z, those functions may not be loaded.
-static 強制使用 static linking 來連接庫(gcc 默認使用 shared linking, 不成功再試用 static linking)。連接庫時有兩種選擇:static linking(*.a, archive file), dynamic linking(*.so, shared object)。
-shared
Produce a shared object which can then be linked with other objects
to form an executable.
-Dmacro[=defn] 定義 macro。
-U 取消 macro 的定義。該 macro 能夠是 either built in or provided with a -D option。
-o 定義 output 文件名。
-f Options of the form -fflag specify machine-independent flags.應該不經常使用吧。
-fPIC emit position-independent code, suitable for dynamic linking and avoiding any limit on the
size of the global offset table.
-m Each target machine types can have its own special options, starting
with -m, to choose among various hardware models or
configurations---for example, 68010 vs 68020, floating coprocessor or
none. A single installed version of the compiler can compile for any
model or configuration, according to the options specified.應該不經常使用吧。