gcc的命令使用格式为:gcc[选项][文件名][选项][文件名]
1. gcc 命令拥有数量庞大的编译选项,按类型可以把选项分为以下几大类。
总体选项:用于控制编译的整个流程。常用选项:
-c:对源文件进行编译或汇编。
-E:对源文件进行预处理。
-S:对源文件进行编译。
-o file:输出目标文件 file。
-v:显示编译阶段的命令。
警告选项:用于控制编译过程中产生的各种警告信息。常用选项:
-W:屏蔽所有的警告信息。
-Wall:显示所有类型的警告信息。
-Werror:出现任何警告信息就停止编译。
调试选项:用于控制调试信息。常用选项:
-g:产生调试信息。
优化选项:用于对目标文件进行优化。常用选项:
-O1:对目标文件的性能进行优化。
-O2:在-O1 的基础上进一步优化,提高目标文件的运行性能。-O3:在-O2 的基础上进一步优化,支持函数集成优化。-O0:不进行优化。
连接器选项:用于控制链接过程。常用选项:-static:使用静态链接。
-llibrary:链接 library 函数库文件。
-L dir:指定连接器的搜索目录 dir。-shared:生成共享文件。
目录选项:用于指定编译器的文件搜索目录。常用选项:
-Idir:指定头文件的搜索目录 dir。-Ldir:指定搜索目录 dir。
2. GCC 工作流程
在c语言的编译流程中,依次要进行:预处理,编译,汇编,链接四个阶段。
1. 预处理阶段(展开头文件)
ep:gcc -E test.c -o test.i
由于在 test.c 中使用了头文件 stdio.h,所以 GCC 在编译时首先要把头文件 stdio.h 中的内容加载到 test.c 中的首部。
在 shell 中输入命令“gcc -E test.c -o test.i”。其中,参数 E 告诉 gcc 命令只进行预编译,不做其他处理;参数 o 用来指明输出的文件名为 test.i。命令运行完毕后就会产生一个名为 test.i 的文件。
2. 编译阶段(语法检查)
ep:gcc -S test.i -o test.s
编译阶段是整个编译过程中最复杂的一个阶段。这里拿自然语言的翻译过程作个对比。
比如在把“I love China”翻译成中文前,需要依次完成以下几个步骤:
1)考察这个句子中每个单词的拼写是不是正确。
2)考察整个句子的语法(比如主谓宾、定状补的结构等)是不是正确。
3)考察整个句子的语义是不是正确。
只有以上三个步骤都正常通过了,才能保证句子被正确翻译。同样,高级编程语言的编译阶段也必须实现这三个步骤。
1) 步骤 1 称为词法分析,主要负责检查关键字、标识符等是否正确。
2) 步骤 2 称为语法分析,主要负责检查程序中语句的语法是否正确。
3) 步骤 3 称为语义分析,主要负责检查程序中语句的逻辑意义是否正确。
在 shell 中输入命令“gcc -S test.i -o test.s”。其中,参数 S 告诉 gcc 命令只进行编译,不做其他处理。命令运行完毕后就会产生一个名为 test.s 的汇编文件。
3. 汇编阶段(产生目标文件)
ep:gcc -c test.s -o test.o
汇编阶段的任务是把汇编程序翻译成 CPU 可以识别的二进制文件,该文件又称为目标文件。
在 shell 中输入命令“gcc -c test.s -o test.o”,其中,参数 c 告诉 gcc 命令只进行汇编,不做其他处理。命令运行完毕后就会产生一个名为 test.o 的目标文件。
4. 链接阶段(链接所有目标文件和库文件)
ep:gcc test.o -o test
链接阶段的任务就是把程序中所有的目标文件和所需的库文件都链接在一起,最终生成一个可以直接运行的文件,称为可执行文件。
在 shell 中输入命令“gcc test.o -o test”,运行完毕后就会产生一个名为 test 的可执行文件。输入命令“./test”执行该文件,就可以得到 test 文件的运行结果。
若未重命名 则 ./a.out 输出