GCC程序编译
Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,它的执行效率比一般编译器要高20%~30%
GCC编译程序时,编译过程只可以被细分为四个阶段:预处理、编译、汇编、链接
文件类型
Gcc通过后缀来区别输入文件的类别:
- .c:源代码文件
- .a:由目标文件构成的库文件
- .C,.cc,.cxx:c++源码文件
- .h:头文件
- .i:已处理过的c源代码文件
- .ii:已预处理过的c++源文件
- .o:编译后的目标文件
- .s:汇编语言源代码文件
- .S:经过预编译的汇编语言源代码文件
基本用法
基本用法
gcc [options] [filenames]
编译选项
- -o output_filename:确定可执行文件的名称,如果没有gcc就给出预设的可执行a.out
- -c:只编译,不链接为可执行文件生成.o为后缀的目标文件
- -g:产生调试工具(GNU的gdb)所必要的符号信息,主要是调试用的命令
- -O:对程序进行优化编译、链接,在编译、链接过程中进行优化处理,这样产生的可执行文件执行效率可以提高,但是速度会慢。
- O2:比-O更好的优化,但是速度会更慢
- -Idirname:将dirname所指的目录加入程序头文件目录中
- Lname:在链接时,装载"libname.a"的函数库,如gcc foo.c -L/home/lib -lfoo -o foo
- -static:静态链接,gcc -static hello.c -o hello
静态链接和动态链接
使用静态库时,连接器找出程序所需的函数,然后将它们拷贝到可执行文件,一旦连接成功,静态程序库也就不再需要了。然而,在动态库中,动态库会在执行程序内留下一个标志指明当程序执行时,首先必须载入这个库,从而节省空间。一般在linux中默认都是动态库。
- -Wall:生成所有警告信息
- -w:不生成任何警告信息
- DWACRO:定义MACRO宏,等效于在程序中使用#define MACRO