编译一个.cpp文件的过程
图片来自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.o
和cout.o
进行合并,当然这个合并是要遵循一定规则的。正是因为链接器要对helloworld.o
和cout.o
的进行调整,所以 helloworld.o
才会被称之为可重定位目标文件。最终经过链接阶段可以得到可执行目标文件helloworld
。
编译一个.cpp文件的过程相关推荐
- 关于.cpp文件包含另一个.cpp文件出错的原因以及解决办法
今天打开自己以前写代码突然觉得在main函数中如果要用的很多自己实现的函数,如果把它们都放在main.cpp文件中太臃肿了.调试起来特别不方便.能不能把这些自己实现的函数放到另外一个文件中呢? 可是又 ...
- RT-Thread中如何预编译一个.c文件
本文介绍在RT-Thread系统,使用scons,如何预编译一个.c文件 首先新建一个测试文件test.c #include "rtthread.h"void test(void) ...
- include.cpp(main函数的cpp文件)文件中包含另一个.cpp文件的错误及原因
当一个main函数的cpp文件包含另一个cpp文件,使用#include "data.cpp" 是不可以的,例如下面 include.cpp #include <stdio ...
- 将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中
将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中 写这种.h和.cpp文件分开的大程序,虽然对很多人来说很简单,对自己来说算是第一次吧,好好学C++,加油~ 题目:定义Point类,由 ...
- C++ 在一个cpp文件中使用另一个cpp文件中定义的函数
C++ 在一个cpp文件中 使用另一个cpp文件中定义的函数 建立一个console项目 头文件 cpp文件 main.cpp 建立一个console项目 以dev为例,在[文件][新建][项目],新 ...
- C/C++语言之通过定义指针函数方式来实现在一个cpp文件里面获取另外一个cpp文件函数的返回值
1.定义函数指针 typedef int (* fun) (); static fun f; 2.代码实现 3.结果 4.总结 我们可以这样使用 在a.h文件里面里面定义函数指针,并且有个传递函数指针 ...
- Linux下如何将源文件逐步编译成目标文件的过程
前言 请讲一下linux如何源文件逐步编译成可执行文件. 解答 首先先上图对编译的整个过程有个感性的认识,然后再逐步分析各个过程. 以hello.c 程序为例 # include <stdio ...
- 多个cpp文件生成so_C++:C++的文件搜索路径
在做大型工程的时候,除了有C++语法知识之外,还要有工程能力. 最先要具备的能力是: 理解C++文件的编译,链接过程. 明白C++头文件的搜索路径. 本文,介绍C++的文件搜索路径. 对于C++文件来 ...
- c语言中.h文件和.cpp文件解析
理论上来说cpp文件与头文件里的内容,只要是C语言所支持的,无论写什么都可以的,比如你在头文件中写函数体实现,任何一个cpp文件包含此头文件就可以将这个函数编译成目标文件的一部分(编译是以cpp文件为 ...
- java 源码分析_Java 源代码编译成 Class 文件的过程分析
原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...
最新文章
- 腾讯AI开源框架Angel 3.0重磅发布:超50万行代码,支持3种算法,打造全栈机器学习平台...
- mac下vi语法高亮
- C++string容器-子串获取
- 华强北耳机版本太多,不知道如何选购?
- java图片的导出,并压缩
- 财经计算机财务函数,会计财务最常用的15个公式函数
- python中的数据分析库有哪些_全网最全数据分析师干货-python篇
- Python机器学习库sklearn自动特征选择(训练集)
- GBase数据库迁移工具介绍
- DevOps 10大IT管理工具(翻译)
- 第二课: 雷电模拟器的多开和打开
- 配音软件哪个好?这三款很火的配音软件,简直是短视频后期配音必备
- jQuery官网下载文档的步骤
- UIAutomatorViewer
- kNN算法实现手写数字识别(机器学习)
- Python 随机提取Excel中部分数据并输出为新表格
- 什么是 DNS 故障?常见原因和解决方案
- 9.28javaweb
- 小程序自定义搜索框_将自定义搜索提供程序添加到Windows 7以及高级搜索技巧
- 马士兵mca课程java学习笔记
热门文章
- 融云 即时通讯 集成相关问题
- 融云通讯服务器,融云IM即时通讯功能接入和部署方式有哪些_如何收费_企业服务汇...
- smail语法 clinit和init的区别
- android 连接蓝牙耳机 播放音乐,Android连接蓝牙耳机播放音乐
- 决策树算法(ID3算法)
- java knn kd树_KNN算法之KD树
- ubuntu20.04装机教程
- 联创机房管理系统服务器密码,高校机房管理系统解决方案.doc
- SGMII和RGMII入门学习
- 产品设计-产品框架设计