inux下GCC编译器及编译命令的使用详解

2019-10-27 12:14发布

gcc 命令格式如下:

gcc [选项] [文件名字] 

主要选项如下:

-c 只编译不链接为可执行文件,编译器将输入的.c 文件编译为.o 的目标文件。

-o<输出文件名> 用来指定编译结束以后的输出文件名,如果使用这个选项的话 GCC 默认编译出来的可执行文件名字为 a.out。

-g 添加调试信息,如果要使用调试工具(如GDB)的话就必须加入此选项,此选项指示编译的时候生成调试所需的符号信息。

-O 对程序进行优化编译,如果使用此选项的话整个源代码在编译、链接的的时候都会进行优化,这样产生的可执行文件执行效率就高。

-O2 比-O 更幅度更大的优化,生成的可执行效率更高,但是整个编译过程会很慢。

在 Windows 下不管我们用啥编译器,如果程序有语法错误的话编译的时候都会指示出来,比如开发 STM32 的时候所使用的 MDK 和 IAR,我们可以根据错误信息方便的修改 bug。那

GCC 编译器有没有错误提示呢?肯定是有的,我们可以测试以下,新名为“3.2”的文件夹,使用 vi 在文件夹“3.2”中创建一个 main.c 文件,在文件里面输入如下代码:

示例代码main.c 文件代码


#include

int main(int argc, char *argv[])
{
int a, b; 6
a = 3;
b = 4
printf("a+b=\n", a + b);
}

在上述代码中有两处错误:

第 8 行、第一处是“b=4”少写了个一个“;”号。第 9 行、第二处应该是

printf(“a+b=%d\n”, a + b);

我们编译以下上述代码,看看 GCC 编译器是否能够检查出错误,编译结果如图所示:

错误提示

从图中可以看出有一个 error,提示在 main.c 文件的第 9 行有错误,错误类型是在printf 之前没有“;”号,这就是第一处错误,我们在“b = 4”后面加上分号,然后接着编译,结果又提示有一个错误,如图所示:

错误提示

在图中,提示我们说文件 main.c 的第 9 行:printf(“a+b=\n”, a + b)有 error,错误是因为太多参数了,我们将其改为:

 printf(“a+b=%d\n”, a + b); 

修改完成以后接着重新编译一下,结果如图所示:

编译成功

在图中我们编译成功,生成了可执行文件 main,执行一下 main,看看结果和我们设计的是否一样,如图所示:

执行结果

可以看出,GCC 编译器和其它编译器一样,不仅能够检测出错误类型,而且标记除了错误发生在哪个文件?哪一行?方便我们去修改代码。

GCC 编译器的编译流程是:预处理、汇编、编译和链接。预处理就是对程序中的宏定义等相关的内容先进行前期的处理。汇编是先将 C 文件转换为汇编文件。当 C 文件转换为汇编文件以后就是文件编译了,编译过程就是将C 源文件编译成.o 结尾的目标文件。编译生成的.o 文件不能直接执行,而是需要最后的链接,如果你的工程有很多个 c 源文件的话最终就会有很多.o文件,将这些.o 文件链接在一起形成完整的一个可执行文件。