一、什么是GCC
GCC是GPL许可证颁发的自由软件,也是GNU计划的重要部分。 GCC旨在创建专用于GNU操作系统的编译器,目前已被大多数Unix操作系统(如Linux、BSD和MacOS X )采用为标准编译器,微软的winner GCC支持多个计算机体系结构芯片,如x86、ARM和MIPS,并移植到许多其他硬件平台上。 在此首先说明在Linux上使用c语言gcc。
1.gcc的使用方法
gcc [选项]文件名
在linux上,可以使用gcc --help显示gcc选项
2.gcc的一般选项
gcc的编译过程
gcc编译的过程可以分解为四个大步骤。
预处理(预处理)
编译(Compilation )
装配(Assembly )
链接(链接)。
让我具体说明一下gcc编译步骤
1、预处理
预处理是指读取c源程序,对其中的伪指令和特殊符号进行“替代”处理; 经过此处理,生成无宏定义、无条件编译指令、无特殊符号的输出文件。 此文件的含义与未预处理的源文件相同,仍然是c文件,但内容不同。 伪指令主要有以下三个方面。
(1)宏定义指令,如#define NAME TokenString、#undef和编译器中的宏,如__DATE__、FILE、LINE、TIME、_ _
)2)条件编译指令,如#ifdef、#ifndef、#else、#elif、#endif等。
(3)头文件中包含#include “FileName”和#include等命令。
预处理的过程主要包括以下过程:
删除所有#define并展开所有宏定义
处理所有条件预编译指令,例如#if、#ifdef、#elif、#else和#endif
处理#include预编译指令,并将包含的文件插入到该预编译指令的位置。
删除所有评论“//”和“//*//”
添加行号和文件标识符,以在编译时生成调试行号和编译错误警告行号。
#pragma编译器指令都将保留,因为编译器必须使用它
预处理通常使用以下命令: 参数-E表示只进行预处理。
gcc -E hello.c -o hello.i
也可以使用以下命令完成预处理过程: 其中从属cpp是预处理器。
cpp hello.c hello.i
经过预处理,hello.i仍然是c语言的源代码,可以使用cat或vim命令查看代码
vim hello.i
2、编译
编译器的工作是通过词法分析和语法分析验证所有指令是否符合语法规则,然后将其翻译成等效的中间代码表示或汇编代码。 如果想了解更多关于编译的环节,请参考其他博客的介绍。
可以使用以下命令进行编译以生成程序集文件:
gcc -S hello.i hello.s
可以使用cat命令查看代码。
cat hello.s
3、汇编
汇编过程实际上是将汇编语言代码翻译成目标机器指令的过程。 对于在翻译系统中处理的每个c语言源程序,最终进行处理以获得相应的目标文件。
可以用以下命令汇编:
gcc -c hello.s -o hello.o
4、链接
汇编程序生成的目标文件不会立即运行,其中可能有很多未解决的问题。 例如,一个源文件中的函数可能引用在另一个源文件中定义的符号(例如变量或函数调用)。 所有这些问题都必须链接在一起才能解决,例如程序中可能调用了库文件中的函数。 链接程序的主要工作是相互连接相关的目标文件。 这意味着将一个文件中引用的元件与另一个文件中的元件定义连接起来,使所有目标文件都成为可以加载和运行到操作系统中的统一的整体或可执行程序。 链接过程取决于开发人员指定的库函数的链接方法
可执行文件中的函数调用分别可以使用动态链接或静态链接的方法。 动态链接缩短了最终可执行文件,需要在内存中仅存储一个共享对象的代码,从而在多个进程使用共享对象时节省内存。 然而,使用动态链路不一定比使用静态链路好,在某些情况下,动态链路可以导致一些性能上的损害。
标签:预处理、gcc、hello、编译、编译器、指令、Linux、链接
资料来源: https://blog.csdn.net/king ring _/article/details/115051281