GCC是一个用于linux系统下编程的编译器。GCC(GNU Compiler Collection)是一套由GNU开发的编程语言编译器。
GCC所遵循的部分约定规则:.c C语言源代码文件;.a 由目标文件构成的档案库文件;.C、.cc、.cxx C++源代码文件;.h 头文件;.i 已经预处理过的C源代码文件;.ii 已经预处理过的C++源代码文件;.m Obj-C源代码文件;.o 编译后的目标文件;.s 汇编语言源代码文件;.S 经过预编译的汇编语言源代码文件。
基本用法:-c 只编译,不连接为可执行文件;-o output_filename 确定输出文件的名称为output_filename。如果不给出这个选项,GCC就给出预设的可执行文件a.out;-g 产生符号调试工具所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项;-On 对程序进行优化编译、连接;-ldirname 将dirname所指出的目录加入到程序头文件目录列表中。
参数详解:
-x language filename
设定文件所使用的语言,使后缀名无效,对以后多个有效。例子:gcc -x c hello.pig。
-x none filename
关掉上一个选项。例子:gcc -x c hello.pig -x none hello2.c
-c
只激活预处理、编译和汇编,也就是只把程序做成obj文件。例子:gcc -c hello.c 将生成.o的文件。
-S
只激活预处理和编译,就是把文件编译成汇编代码。例子:gcc -S hello.c 将生成.s的汇编代码。
-E
只激活预处理,这个不生成文件,需要把它重定向到一个输出文件里面。例子:gcc -E hello.c > pianoapan.txt
-o
制定目标名称。
例子:gcc -o hello.exe hello.c
gcc -o hello.asm -S hello.c
-pipe
使用管道代替编译中的临时文件。
例子:gcc -pipe -o hello.exe hello.c
-ansi
关闭GNU C中与ANSI C不兼容的特性。
-include file
包含某个代码,相当于#include <filename>
例子:gcc hello.c -include /root/pianopan.h
-imacros file
将file文件中的宏,扩展到gcc的输入文件。
-Dmacro
相当于C语言中的#define macro。
-Dmacro=defn
相当于C语言中的#define macro=defn。
-Umacro
相当于C语言中的#undef macro。
-undef
取消对任何非标准宏的定义。
-Idir
在你是用#include "file"的时候,gcc会先在当前目录查找你所制定的头文件,如果没有找到,它会回到缺省的头文件目录中找。如果使用-I制定了目录,它会先在你所制定的目录中查找,然后再按常规的顺序去找。
-idirafter dir
在-I的目录中查找失败,将到这个目录里面查找。
-iprefix prefix
-iwithprefix dir
一般一起使用,当-I的目录查找失败,会到prefix+dir下查找。
-nostdinc
使编译器不再系统缺省的头文件目录里面找,一般和-I联合使用,明确限定头文件的位置。
-C
在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的。
-M
生成文件关联信息。包含目标文件所依赖的所有源代码可以用gcc -M hello.c来测试一下。
-MM
和上面的那个一样,但是它将忽略由#include <file>造成的依赖关系。
-MMD
和-MM相同,但是输出导入到.d文件里面。
-Wa,option
此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然后传递给汇编程序。
-Wl.option
此选项传递option给连接程序。
-llibrary
制定编译的时候使用的库。
例子:gcc -lcurses hello.c 使用ncurses库编译程序。
-Ldir
制定编译的时候,搜索库的路径。不然,编译器只在标准库的目录找。
-On
编译器优化选项的4个级别。
-g
只是编译器在编译的时候,产生调试信息。
-ggdb
此选项将尽可能的生产gdb的可以使用的调试信息。
-static
此选项将禁止使用动态库。所以,编译出来的东西,一般都很大,不需要什么动态链接库就可以运行。
-share
此选项将尽可能使用动态库,所以生成的文件比较小,但是需要动态库。