目录
前言
GCC,全称GNU Compiler Collection,是开源世界中的编译巨人,为多种编程语言提供了至关重要的编译支持。作为软件开发不可或缺的工具,GCC承担着将人类可读的源代码转换为机器高效执行的二进制代码的任务。它不仅加速了编译过程,还配备了强大的错误检测机制,帮助开发者定位并修复代码中的问题。了解GCC,便是迈向高效、可靠编译的关键一步。
Gcc的编译步骤
GCC是一套用于编译C、C++、Objective-C、Fortran等多种语言的编译器。GCC编译流程通常包括四个主要步骤:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。
预处理:在预处理阶段,源代码文件中的所有预处理指令,如#include、#define等,都会被处理。这一步骤会生成一个中间代码文件,通常是以.i为扩展名的文件。可以使用gcc -E命令来进行源代码的预处理。
编译:编译阶段将预处理后的代码转换为汇编语言代码,生成一个汇编语言文件,通常以.s为扩展名。使用gcc -S命令可以只进行编译步骤。
汇编:在汇编阶段,汇编代码被转换为机器码,生成目标文件,即.o或.obj文件。这是由汇编器完成的,可以通过gcc -c进行此步骤。
链接:链接阶段将多个目标文件以及所需的库文件链接起来,生成最终的可执行文件或者共享库。使用gcc命令不加选项时,默认进行链接步骤。
这些步骤中,每一步都可能需要不同的命令行选项来控制具体的行为,例如指定头文件路径、警告级别等。
-I :指定头文件所在目录位置,用于当头文件和c文件不在同一个目录时;
gcc hello.c -o a.out -I 头文件所在目录;
-c :只做预处理、编译、汇编,得到二进制文件;
-g :编译时添加调试语句,主要支持gdb调试;
-Wall :warning all 显示所有警告信息;
-D :向程序中动态注册宏定义;当做调试开关
#ifdef Hello
#define Hi 20
#endif
在c程序中做如上定义后,执行gcc hello.c -o a.out -D Hello,此时c程序后面出现的Hi就被宏定义 。
一些常用的GCC编译相关命令及其功能
gcc -E source.c -o output.i://仅进行预处理,输出预处理后的文件到output.i。
gcc -S source.c -o output.s://进行预处理和编译,输出汇编文件到output.s。
gcc -c source.c -o output.o://进行预处理、编译和汇编,输出目标文件到output.o。
gcc source.o -o program: //将目标文件链接成可执行文件program。
gcc source.c -o program: // 编译并链接源文件,直接生成可执行文件program。
gcc 和 g++
提到gcc就无法避免g++,下面简单介绍两者不同之处。GCC和G++都是功能强大的编译器,但是它们在处理C和C++代码时存在一些细微的差别。
- 语言识别:当遇到
.c
扩展名的文件时,GCC会将其当作C语言源文件进行编译,而G++则会将其作为C++语言源文件编译。这意味着即使代码是纯C代码,G++也会按照C++的规则进行编译。 - 标准库链接:G++在编译任何源文件时,都会自动链接到C++标准库(STL),而GCC则不会这样做。如果使用GCC编译C++代码并希望使用STL,则需要手动添加参数
-lstdc++
来链接C++标准库。 - 预处理器:GCC在编译C文件时可用的预定义宏较少,而在编译C++文件时(无论是GCC还是G++),会加入一些额外的宏,这可能会影响到条件编译等特性的使用。
- 命令行选项:G++通过
-xc++
和-xnone
选项将.c
文件强制视为C++,并使用cc1plus
进行编译,而GCC则使用cc1
对.c
文件进行编译。