您好!欢迎光临現金網老虎機,我们竭诚为您服务,期待与您合作!
定制咨询热线0731-86906038
現金網老虎機

详解CC++代码的预处理、编译、汇编、链接全过程

发布时间:2024-03-20 14:10:25 来源:常见问题

  编写完成一个C/C++程序后,想要运行起来,必须要经过四个步骤:预处理、编译、汇编和链接。每个步骤都会生成对应的文件,如下图所示(注意后缀名):

  为了后面过程的介绍更方便,这里对C++编译过程中涉及的一些常用名词进行解释。

  本文中只演示从源代码生成可执行二进制文件的过程,暂不涉及调试过程。调试的配置会在另一篇文章中专门介绍。

  预编译把一些#define的宏定义完成文本替换,然后将#include的文件里的内容复制到.cpp文件里,如果.h文件里还有.h文件,就递归展开。在预处理这一步,代码注释直接被忽略,不会进入到后续的处理中,所以注释在程序中不会执行。

  gcc/g++的预处理实质上是通过预处理器cpp(应该是c preprocess的缩写?)来完成的,所以我们既可以通过g++ -E,也可以通过cpp命令对main.cpp进行预处理:

  上述命令中: -g++ -E是让编译器在预处理之后就退出,不进行后续编译过程,等价于cpp指令 --I include/用于指定头文件目录 -main.cpp是要预处理的源文件 --o main.i用于指定生成的文件名

  —— include —— func.h —— src—— func.cpp —— main.cpp —— main.i

  它的工作是检查词法和语法规则,所以,如果程序没有词法或则语法错误,那么不管逻辑是怎样错误的,都不会报错

  编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程

  与预处理类似,上述命令中: -g++ -S是让编译器在编译之后停止,不进行后续过程 --I include/用于指定头文件目录 -main.cpp是要编译的源文件 --o main.s用于指定生成的文件名

  编译完成后,会生成程序的汇编代码main.s,这也是文本文件,可以直接用任意文本编辑器查看。

  gcc/g++的汇编过程通过as命令完成,所以我们可以通过g++ -c或as命令完成汇编:

  上述指令中: -g++ -c让编译器在汇编之后退出,等价于as--I include/仍是用于指定头文件目录 -main.cpp是要汇编的源文件 --o main.o用于指定生成的文件名

  汇编这一步需要为每一个源文件(本文示例代码中为main.cpp、func.cpp)产生一个目标文件。因此func.cpp也需要执行一次这个汇编过程产生一个func.o文件:

  C/C++代码经过汇编之后生成的目标文件(*.o)并不是最终的可执行二进制文件,而仍是一种中间文件(或称临时文件),目标文件仍然需要经过链接(Link)才能变成可执行文件。

  既然目标文件和可执行文件的格式是一样的(都是二进制格式),为什么还要再链接一次呢?

  编译只是将我们自己写的代码变成了二进制形式,它还需要和系统组件(比如标准库、动态链接库等)结合起来,这些组件都是程序运行所必须的

  链接(Link)其实就是一个“打包”的过程,它将所有二进制形式的目标文件(.o)和系统组件组合成一个可执行文件

  文件。这个时候,链接器除了将目标文件和系统组件组合起来,还需要将编译器生成的多个

  以本文中的代码为例,将func.o和main.o链接成可执行文件main.out,指令如下:

  从上面的介绍可以看出,从C++源代码到最终的可执行文件的中间过程并不简单。了解预处理、编译、汇编、链接各个步骤的作用有助于我们处理更加复杂的项目工程。

現金網老虎機

管理员

该内容暂无评论