程序的编译和链接过程

马谦马谦马谦 C/C++评论386字数 721阅读2分24秒阅读模式

一、概述

一个程序在从源码变成二进制程序之间一共有四个步骤:预处理,编译,生成目标文件,链接。

以下展示了一个简单的加法程序的编译过程:

二、预处理

预处理阶段主要有以下的操作:

  • 头文件替换
  • 宏定义替换
  • 删除注释
  • 预处理指令处理

在GCC中,-E选项用于预处理,执行g++ main.cpp -E -o main.i

可以看到,main.i的内容已经变得十分复杂,预处理后总共有接近两万行。

文件的后就是我们的实际代码区域,其中的头文件和注释也都被处理掉了。

三、编译

预处理完成后需要编译,编译是把程序编程汇编指令的过程。在这一阶段会分析代码,解析语法和错误。

-S选项用用于生成汇编指令,生成后它依旧还是一个文本文件,执行g++ main.i -S main.s后的main.s中的内容:

程序的编译和链接过程

四、生成目标文件

目标文件也就是我们所说的.o文件了,在编译过后,文件还是不能直接被运行的。生成目标文件的过程会导出属于自己的符号表。这个步骤之后它就已经是一个二进制文件了,里面的符号可以通过诸如readelf的命令来读取出来。

生成目标文件的选项是-c,执行g++ main.s -c main.o

实际上,如果不经过前面的两个步骤,直接对源文件使用-c也能直接生成目标文件,编译器会自动执行中间的步骤:

五、链接

链接过程将把多个文件之间的符号表结合起来,生成最终的可执行文件。

 

 最后更新:2021-2-23
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2018年9月14日23:08:41
  • 转载请务必保留本文链接:https://www.dyxmq.cn/program/code/c-cpp/program-compilation-and-linking-process.html
C++文件输入输出流fstream的基本用法 C/C++

C++文件输入输出流fstream的基本用法

一、文件流 C++的IO类中定义了三个文件读写流fstream、ifstream以及ofstream,它们都继承于相同的父类istream,通过不同的实现以实现不同的文件流操作。 三者的区别为: if...
C++11中const_cast的真实使用场景 C/C++

C++11中const_cast的真实使用场景

一、const和成员函数的故事 const的用途有以下几种: 修饰全局、局部、成员变量 修饰成员函数 修饰变量的时候const限制了变量在整个程序运行期间都是不能修改的,而修饰成员函数的时候限制函数内...
C++11中的override和final关键字 C/C++

C++11中的override和final关键字

一、前言 昨天在公司做代码扫描,发现很多类似以下的代码都产生了告警,导致扫描不通过: virtual int func() override {} 不通过的原因是:同时使用virtual和overri...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证