注:以下内容前提是目标系统已安装
gcc/g++
,若不确定是否安装,可通过gcc -v
语句进行查看!
1、精简
在Linux
系统中,gcc/g++
是用于c
或cpp
文件进行编译的工具。最简单的编译命令格式为:
gcc test.c -o test
其中 test.c
为目标文件,test
为编译后的执行文件。
案例如下
2、复杂
一般完整的编译过程需要经历以下几个阶段:
- 预处理(进行宏替换)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 连接(生成可执行文件或库文件)
2.1 预处理
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
其指令格式为
gcc –E test.c –o test.i
其中,选项“-E”
,该选项的作用是让 gcc
在预处理结束后停止编译过程。
选项“-o”
是指目标文件,“.i”
文件为已经过预处理的C原始程序。
2.2 编译
在这个阶段中,gcc
首先要检查代码的规范性、是否有语法错误等, 以确定代码的实际要做的工作,在检查无误后,gcc
把代码翻译成汇编语言。
其指令格式为
gcc –S test.i –o test.s
其中,用户可以使用“-S”
选项来进行查看, 该选项只进行编译而不进行汇编,生成汇编代码。
2.3 汇编
该部分主要功能是生成机器可识别代码!
其指令格式为
gcc –c test.s –o test.o
其中,可使用选项“-c”
就可看到汇编代码已转化为“.o”
的二进制目标代码。
2.4 连接
该部分主要功能是 生成可执行文件或库文件!
指令格式为
gcc test.o –o test
即在前面步骤成功进行编译之后,就进入了链接阶段。
2.5 案例
针对1
中的程序,按上述步骤进行编译,具体过程如下
注意:以上步骤中要注意大小写,因为gcc中的选项中会有大小写要求!!否则会报错,如下
3、指令总结
gcc
选项
-E //只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S //编译到汇编语言不进行汇编和链接
-c //编译到目标代码
-o //文件输出到 文件
-static //此选项对生成的文件采用静态链接
-g //生成调试信息。GNU 调试器可利用该信息。
-shared //此选项将尽量使用动态库,所以生成文件比较小,但是需要系统有动态库.
-O0
-O1
-O2
-O3 //编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w //不生成任何警告信息。
-Wall //生成所有警告信息。