GCC 介绍

Posted coder_up

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GCC 介绍相关的知识,希望对你有一定的参考价值。

1. gcc支持编译的一些源文件后缀名

后缀源文件
.cc语言源文件
.C .cc .cxxc++源文件
.mObject-C源文件
.i经过与处理后的C源文件
.ii经过预处理后的C++源文件
.s .S汇编语言源文件
.h预处理文件(头文件)
.o目标文件
.a存档文件

2. gcc 编译程序的流程

源文件(hello.c)——>预处理(预处理器)——>编译(编译器)——>汇编(汇编器)——>链接(连接器)——>可执行文件(executefile)

Tips:

  1. Linux的可执行文件并没有像 Windows 那样有明显的.exe后缀名, 只需向其分配x(可执行)权限即可 sudo chmod u+x excutefile
  2. 作为Linux程序员,我们可以让gcc在编译的任何阶段结束,以便检查或使用该阶段的输出(这个很重要)

3. gcc 到底背着我们做了什么

1. 首先gcc会调用预处理程序cpp,由它负责展开在源程序中定义的宏(上例:#include ),向其中插入#include语句所包含的内容(原地展开stdio.h包含的代码)

1. 获得预处理后的文件

$ gcc -E hello.c -o hello.i

gcc的-E参数可以让gcc在预处理结束后停止编译过程。
hello.i这是一个经过预处理器处理之后的C源文件

2. 将*.i文件编译为目标代码

$ gcc -c hello.i -o hello.o

gcc默认将.i文件看成是预处理后的C语言源代码,因此它会直接跳过预处理,开始编译过程。(之后它就是二进制文件了)

Tips:

  1. 请记住,gcc预处理源文件的时候(第一步),不会进行语法错误的检查
  2. 语法检查会在第二步进行,比如花括号不匹配,行末尾没有分号,关键字错误等......

3. 连接器将目标文件链接为一个可执行文件

$ gcc hello.o -o hello

4. gcc 编译模块化的程序

gcc hello_print.c hello_main.c -o hello可以看成是执行了一下3条命令

gcc -c hello_print.c -o hello_print.o
gcc -c hello_main.c -o hello_main.o
gcc hello_print.o hello_main.o -o hello

这样如果一个团队一起开发 每个人只要编译一个.so文件 最后一链接就好了,不会一个人修改后,然后还有一起在从新编译一遍!

以上是关于GCC 介绍的主要内容,如果未能解决你的问题,请参考以下文章

GCC 插件入门

写入数组末尾的影响[重复]

未记录的 GCC 扩展:结构中的 VLA

gcc命令行中静态库的cpptask排序

C程序编译链接gcc使用命令介绍

[An Introduction to GCC 学习笔记] 01 介绍GCC发展历史