1.编译过程
1.1编译的概念
编译程序读取源程序(字符流),对之进行语法和词法分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。
编译的完整过程:C源程序—>预编译处理(.c)—>编译、优化程序(.s、.asm)—>编译生成汇编程序(.obj、.o、.a、.ko)—>链接生成可执行程序(.exe、.elf、.axf)
1.2 常用选项
- -E:只进行预处理、不编译
- -s:只编译、不汇编
- -c:只编译、汇编、不链接
- -o:链接输出指定文件名
- -l:指定所需链接的库名
- -L:指定链接所需库(动态库或静态库)的路径
- -ansi:指定ANSI标准
- -std=c99:指定c99标准
- -Werror:不分警告和错误,遇到任何警告都停止编译
- -Wall:开启大部分警告提示
2.预处理
gcc命令:ten@Public_RPi:~/wangruijie$ gcc -E hello.c -o hello.i
预处理是读取c源程序,对其中的伪指令(以#开头的指令,也就是宏)和特殊符号进行“替代”处理, 经过此处理生成一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同没有经过预处理的源文件是相同的,仍然是c文件,但内容有所不同,伪指令主要包括以下三个方面:
- 宏定义指令,如#define, #undef以及编译器内建的一些宏, 如__DATE__, FILE。
- 条件编译指令,如#ifdef, #ifndef, #else, #elif, #endif等。
- 头文件包含的指令:如#include<>/"".
2.1代码示例
给出没有经过预处理的代码
1 #include<stdio.h>
2
3 int main(int argc, char **argv)
4