图片来自bilibili 传送门


首先我们来看helloworld.cpp文件的内容

#include <iostream>
using namespace std;int main()
{cout << "hello world!" <<endl;return 0;
}

接下来,通过一条简单的命令即可完成对源代码的编译,生成可执行程序helloworld

gcc -o helloworld helloworld.cpp

通过这条命令,编译器gcc就会将一个文本文件编译成了一个可执行的文件。虽然是一条命令,但是这个过程分为四个阶段,分别为预处理、编译、汇编以及链接。

预处理


预处理器会根据以#开头的代码,来修改原始程序。例如helloworld程序中引入了头文件 iosream ,预处理器会读取该头文件中的内容,将其中的内容直接插入到源程序中,结果就得到了另外一个 cpp 程序,这个经过预处理器处理后得到的文件通常以 .i 结尾,说白了就是, helloworld.cpp 经过预处理器后得到 helloworld.i,这个helloworld.i仍旧是一个文本文件。

编译


我们的程序经常会在编译期间报错对不对,所以编译期间编译器会对我们的程序进行词法分析语法分析语义分析中间代码生成以及优化等等一系列的中间操作,生成helloworld.s文件。

汇编

汇编阶段汇编器根据指令集将汇编程序helloworld.s翻译成机器指令,并且把这一系列的机器指令按照固定的规则进行打包,得到可重定位目标文件 helloworld.o.

链接


连接阶段也是程序在运行之前出错的重灾区,在 helloworld 这个程序中,我们调用了cout函数,这个函数是c++标准库中的一个函数,这个cout函数在是在名为 cout.o 一个提前编译好的目标文件,链接器将helloworld.ocout.o 进行合并,当然这个合并是要遵循一定规则的。正是因为链接器要对helloworld.ocout.o 的进行调整,所以 helloworld.o 才会被称之为可重定位目标文件。最终经过链接阶段可以得到可执行目标文件helloworld

编译一个.cpp文件的过程相关推荐

  1. 关于.cpp文件包含另一个.cpp文件出错的原因以及解决办法

    今天打开自己以前写代码突然觉得在main函数中如果要用的很多自己实现的函数,如果把它们都放在main.cpp文件中太臃肿了.调试起来特别不方便.能不能把这些自己实现的函数放到另外一个文件中呢? 可是又 ...

  2. RT-Thread中如何预编译一个.c文件

    本文介绍在RT-Thread系统,使用scons,如何预编译一个.c文件 首先新建一个测试文件test.c #include "rtthread.h"void test(void) ...

  3. include.cpp(main函数的cpp文件)文件中包含另一个.cpp文件的错误及原因

    当一个main函数的cpp文件包含另一个cpp文件,使用#include "data.cpp"  是不可以的,例如下面 include.cpp #include <stdio ...

  4. 将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中

    将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中 写这种.h和.cpp文件分开的大程序,虽然对很多人来说很简单,对自己来说算是第一次吧,好好学C++,加油~ 题目:定义Point类,由 ...

  5. C++ 在一个cpp文件中使用另一个cpp文件中定义的函数

    C++ 在一个cpp文件中 使用另一个cpp文件中定义的函数 建立一个console项目 头文件 cpp文件 main.cpp 建立一个console项目 以dev为例,在[文件][新建][项目],新 ...

  6. C/C++语言之通过定义指针函数方式来实现在一个cpp文件里面获取另外一个cpp文件函数的返回值

    1.定义函数指针 typedef int (* fun) (); static fun f; 2.代码实现 3.结果 4.总结 我们可以这样使用 在a.h文件里面里面定义函数指针,并且有个传递函数指针 ...

  7. Linux下如何将源文件逐步编译成目标文件的过程

    前言 请讲一下linux如何源文件逐步编译成可执行文件. 解答 首先先上图对编译的整个过程有个感性的认识,然后再逐步分析各个过程.  以hello.c 程序为例 # include <stdio ...

  8. 多个cpp文件生成so_C++:C++的文件搜索路径

    在做大型工程的时候,除了有C++语法知识之外,还要有工程能力. 最先要具备的能力是: 理解C++文件的编译,链接过程. 明白C++头文件的搜索路径. 本文,介绍C++的文件搜索路径. 对于C++文件来 ...

  9. c语言中.h文件和.cpp文件解析

    理论上来说cpp文件与头文件里的内容,只要是C语言所支持的,无论写什么都可以的,比如你在头文件中写函数体实现,任何一个cpp文件包含此头文件就可以将这个函数编译成目标文件的一部分(编译是以cpp文件为 ...

  10. java 源码分析_Java 源代码编译成 Class 文件的过程分析

    原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...

最新文章

  1. 腾讯AI开源框架Angel 3.0重磅发布:超50万行代码,支持3种算法,打造全栈机器学习平台...
  2. mac下vi语法高亮
  3. C++string容器-子串获取
  4. 华强北耳机版本太多,不知道如何选购?
  5. java图片的导出,并压缩
  6. 财经计算机财务函数,会计财务最常用的15个公式函数
  7. python中的数据分析库有哪些_全网最全数据分析师干货-python篇
  8. Python机器学习库sklearn自动特征选择(训练集)
  9. GBase数据库迁移工具介绍
  10. DevOps 10大IT管理工具(翻译)
  11. 第二课: 雷电模拟器的多开和打开
  12. 配音软件哪个好?这三款很火的配音软件,简直是短视频后期配音必备
  13. jQuery官网下载文档的步骤
  14. UIAutomatorViewer
  15. kNN算法实现手写数字识别(机器学习)
  16. Python 随机提取Excel中部分数据并输出为新表格
  17. 什么是 DNS 故障?常见原因和解决方案
  18. 9.28javaweb
  19. 小程序自定义搜索框_将自定义搜索提供程序添加到Windows 7以及高级搜索技巧
  20. 马士兵mca课程java学习笔记

热门文章

  1. 融云 即时通讯 集成相关问题
  2. 融云通讯服务器,融云IM即时通讯功能接入和部署方式有哪些_如何收费_企业服务汇...
  3. smail语法 clinit和init的区别
  4. android 连接蓝牙耳机 播放音乐,Android连接蓝牙耳机播放音乐
  5. 决策树算法(ID3算法)
  6. java knn kd树_KNN算法之KD树
  7. ubuntu20.04装机教程
  8. 联创机房管理系统服务器密码,高校机房管理系统解决方案.doc
  9. SGMII和RGMII入门学习
  10. 产品设计-产品框架设计