C++ —— C++程序编译的四个过程

g++是Linux下C++的编译器;我为什么会选择Linux下的g++编译器,就是因为g++可以看到程序从编译到运行的过程做了些什么。而VS等集成开发环境看不到这些,并不是说VS工具不好,(VS还是相当好用的...)。对于学习来说,需要知道程序从编译到运行进行了哪些工作,做了哪些事情,首推g++编译器(这个看个人习惯)。

一、常见文件后缀

.c为后缀的文件:c语言源代码文件

.a为后缀的文件:是由目标文件构成的库文件

.C,.cc为后缀的文件:是c++源代码文件

.h为后缀的文件:头文件

o为后缀的文件:是编译后的目标文件

.s为后缀的文件:是汇编语言源代码文件

.m为后缀的文件:Objective-C原始程序

.so为后缀的文件:编译后的动态库文件

二、g++执行的四个过程

1、预处理:条件编译,头文件包含,宏替换的处理,生成.i文件。

2、编译:将预处理后的文件转换成汇编语言,生成.s文件

3、汇编:汇编变为目标代码(机器代码)生成.o的文件

4、链接:连接目标代码,生成可执行程序

三、最简单的C++程序——"helloworld!\n"

// 新建hello.cpp文件,vim编辑
#include <iostream>
using namespace std;int main(void)
{count << "hello world!"<< endl;reutrn 0;
}

(1)预处理阶段

g++ -E hello.cpp > hello.i

通过vim打开hello.i文件,你会发现一些情况(最好是自己观察,看看哪些内容被换了);

宏的替换,还有注释的消除,还有找到相关的库文件,将#include文件的全部内容插入。若用<>括起文件则在系统的INCLUDE目录中寻找文件,若用""括起文件则在当前目录中寻找文件。

用编辑器打开hello.i会发现有很多很多代码,你只需要看最后部分就会发现,预处理做了宏的替换,还有注释的消除,可以理解为无关代码的清除。

(2)编译

g++ -S hello.cpp

生成hello.s文件,.s文件表示是汇编文件,用编辑器打开就都是汇编指令。(可以通过vim编辑器看看hello.s里面的内容【都是汇编指令,哈哈】)。

(3)汇编

g++ -c hello.cpp

汇编变为目标代码(机器代码)生成.o的文件,.o是gcc生成的目标文件,用编辑器打开就都是二进制机器码。

(4)链接 ——链接生成可执行文件(库文件进行链接)

g++ -o hello hello.cpp

程序运行:./hello【输出hello world!】

在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库(可以这么理解就是不带main()函数的.cpp生成的)。

可以重新查看这个小程序,在这个程序中并没有定义”cout”的函数(准确说cout不是函数,cout却很独特:既不是函数,似乎也不是C++特别规定出来的像if,for一类有特殊语法的“语句”,其实说到底还是函数调用,不过这函数有些特殊,用的是运算符重载,确切地说是重载了“<<”运算符。这里如果用pritf()函数说明会更好,暂且当做函数理解吧)实现,且在预编译中包含进的”iostream”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现”cout”函数的呢?系统把这些函数实现都被做到名为stdc++的库文件中去了,在没有特别指定时,g++会到系统默认的搜索路径”/usr/lib”下进行查找,也就是链接到stdc++库函数中去,这样就能实现函数”cout”了,而这也就是链接的作用。

C++ —— C++程序编译的四个过程相关推荐

  1. 编译的四个过程-预处理、编译、汇编、链接

    编译的四个过程-预处理.编译.汇编.链接 程序编译成可执行文件的过程可分为四步:预处理.编译.汇编.链接.下面将以main.c为目标文件进行详细讲解: 1.预处理: 通过gcc -E main.c - ...

  2. Linux下C/C++程序编译链接加载过程中的常见问题及解决方法

    Linux下C/C++程序编译链接加载过程中的常见问题及解决方法 1 头文件包含的问题 报错信息 该错误通常发生在编译时,常见报错信息如下: run.cpp:2:10: fatal error: dl ...

  3. gcc编译的四个过程

    gcc是什么? GNU编译器套件(GNU Compiler Collection)包括C.C++.Objective-C.Fortran.Java.Ada和Go语言的前端,也包括了这些语言的库(如li ...

  4. java 程序编译和运行的过程

    Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程. 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1.源文件由编译器编译成字节码(ByteCode)  2 ...

  5. Java程序编译和运行的过程

    Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程. 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1.源文件由编译器编译成字节码(ByteCode)  2 ...

  6. Linux 10分钟掌握Linux常用开发工具及编译的四个过程

    Linux下的常用开发工具 软件包管理工具 yum–类似于手机上的应用商店(管理当前系统中能够安装的工具以及卸载的工具,并且实现安装及卸载操作) 1.查看所能安装的软件:yum list 查看所有工具 ...

  7. C++程序编译-链接-加载过程初探-符号表

    文章目录 前言 符号表 nm指令 看一下hello world 变量和函数在符号表中的位置 看看类的定义 把类和主程序一起打包测试 符号表角度看编译与链接 加载程序到内存 前言 从自己接触计算机程序设 ...

  8. Java在加载阶段会加载依赖吗,Java程序编译和运行过程之 一个对象的生命之旅(类加载和类加载器)...

    Java程序从创建到运行要经过两个大步骤 1:源文件(.java)由编译器编译成字节码ByteCode(.class) 2:字节码由Java虚拟机解释并运行 源文件编译成字节码,主要分成两个部分: 1 ...

  9. 【Linux】编译的四个步骤

    目录 平常的使用: 安装软件 编写:vi/vim vscode 编译 执行 路径/文件名 计算机五大部件 编译四步 1.预编译(处理#) 2.编译(查错,代码到汇编) 3.汇编(汇编到二进制指令) 4 ...

最新文章

  1. Java后端Java面试题总结2021(春招+秋招+社招)
  2. 数据中心行业哪个证书含金量最高?对职业最有帮助?
  3. Docker 在容器中部署静态网站
  4. [BJDCTF 2nd]8086(异或脚本解题)
  5. 入门训练 Fibonacci数列 c语言
  6. 《长调》 :寻找我们共同失去的天堂
  7. C++小型公司管理系统
  8. 32 - III. 从上到下打印二叉树 III
  9. Python项目实战:爬取斗图网表情包图片
  10. SpringCloud实战(三)集成Open-Feign实现远程⽅法调⽤
  11. 深入理解jvm虚拟机(面试复习)
  12. 电子电工产品成品及材料灼热丝测试用试验仪
  13. java 保存文件 中文乱码_java文件中文乱码问题
  14. awvs安装|User acunetix already exist. Home directory for user acunetix not found.
  15. 高通骁龙600系列处理器
  16. ubuntu 双显卡安装n卡 Quadro K620 Tesla K80*8 显卡驱动的卸载 (已解决)没有图形界面。黑屏
  17. 在线检测笔记本电脑屏幕坏点
  18. MD5 base64 sha1 加密,解密
  19. 郑清 - 日常作息表 - July - 2019
  20. 北师大 外国教育史-5(各国教育)

热门文章

  1. 新人报道,写的东西还请大神们多指导!也希望能让和我一样的同事少走弯路。...
  2. 可以生成自动文档的注释
  3. 缺氧游戏计算机,缺氧PC最低什么配置一览 你觉得高吗
  4. eth一张_听说eth2.0利好落地了?那么为何eth反而涨了?
  5. maya脚本用python还是mel_替换/替换材质的Maya Python/MEL脚本
  6. Flask 上下文源码解析
  7. 20温控f1什么意思_欧姆龙温控器是什么 欧姆龙温控器介绍【图文】
  8. scrapy框架_Python学习之Scrapy框架
  9. 修改页面后获得flag_互动征集丨是时候为2021立flag了
  10. 交通警察手势信号(动画演示)