一个C++源文件从文本到可执行文件经历的过程

一个C++源文件从文本到可执行文件经历的过程

以Hello World为例进行说明

首先我们编写一个cpp源程序

test.cpp

#include <iostream>

using namespace std;

int main() {
    cout << "hello world" << endl;
    return 0;
}

使用g++编译命令时

g++ -o test test.cpp

Gcc编译器会将源程序test.cpp 变为一个test可执行文件

其中会经过四个阶段

1.预处理阶段

首先test.cpp(源程序文本)会由预处理器(cpp) 修改

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

变为test.i文件,

-E选项是只运行C预处理器的选项

>是重定向一个输出文件 test.i

可以用文本编辑器打开test.i文件,发现

我们的程序之前多了很多东西

实际上就是将头文件#include 库中的内容插入程序文本当中,得到了test.i文件

2.编译阶段

在得到了test.i文件后

就可以进入编译阶段了,编译阶段,编译器(ccl)将文本文件test.i翻译成文本文件test.s,这是一个汇编程序

我们使用-S编译选项可以得到.s程序

g++ test.cpp -S

3.汇编阶段

得到了汇编程序后,汇编器(as) 会将test.s文件进行汇编,即汇编指令变为机器语言指令,并把这些指令打包成一种 可重定位目标程序并将结果保存在test.o中

使用 -c 编译选项,该选项只编译生成目标文件,不链接

g++ -c test.s -o test.o

4.链接阶段

当一个程序调用了标准库中的函数,例如printf、cout等,这个函数已经存在于一个已经单独预编译好了的.o文件中,而这个文件必须以某种方式合并到我们的test.o当中,得到test文件

g++ test.o -o test 动态链接

g++ tets.o -static -o test静态链接

2种都可生成可执行文件,前者文件只包含文件命,运行时再链接相关函数,后者编译时便链接相关函数,前者体积小,运行时没后者快,后者体积大。

这样得到一个可执行目标文件,就可以被加载到内存当中,有系统执行了

原文地址:https://www.cnblogs.com/buerdepepeqi/p/12361355.html

时间: 2024-10-27 06:45:12

一个C++源文件从文本到可执行文件经历的过程的相关文章

C++源文件从文本到可执行文件经历的过程?

1.预处理 源代码文件中头文件.宏定义等进行分析,生成预编译文件 预处理阶段:对源代码文件中文件包含关系(头文件).预编译语句(宏定义)进行分析和替换,生成预编译文件. 编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件 汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件 链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件 原文地址:https://www.cnblogs.com/pacino12134/p/11259111.html

Vim,一个开放源代码的文本编辑器(转)

Vim,http://linux.21ds.net/2002/03/13/0268dc26fd9c725c23dae68d797935f3/ 作者:Bram Moolenaar 翻译:slimzhao 开放源码的自由软件-VIM的主创者在本文中讲述了 vim的开发内幕和发展方向. 同时提出慈善软件的概念并解释了Bram为何将这一概念用之于vim. 本文也深入程序内部的函数和数据结构, 作者讲述了vim这一复杂的程序是如何工作的, 并且讨论了在vim最新版6.0中的新功能. 介绍 不太可能你还从来

一个java源文件中为什么只能有一个public类。

我们都遇到过一个源文件中有多个java类,但当第一个类使用public修饰时,如果下面还有类使用public修饰,会报错.也就是是说一个java源文件最多只能有一个public类. 当有一个public类时,源文件名必须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求. java虚拟机实例通过调用某个类的main()来运行一个Java程序,而这个main()必须是public static void 并接收一个字符串数组作为参数,任何拥有这样一个main(

浅谈为什么一个java源文件中只能有一个public类?

声明,本篇文章为转载 转载 http://blog.csdn.net/bareheadzzq/article/details/6562211 最近在一个java文件中实现了几个类,其中一个声明为public类型,但编译器报错:后来将public去掉,也即文件中没有一个public类,程序正常运行,有些困惑,最后通过本文章找到答案,为以后方便查找,转载,感谢作者. 结论: 一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必 须与之一致,否则无法编译,如果源文件中

第7章 一个java源文件中只能有一个public类

一个Java源文件中最多只能有一个public类, 1)当有一个public类时,源文件名必须与之一致,否则无法编译, 2)如果源文件中没有一个public类,则文件名与类中没有一致性要求. 至于main()不是必须要放在public类中才能运行程序. 备注: 第一: Test7.java源文件: class Test5{ int i = 1; } public class Test6{ int i = 2; public static void main(String[] args){ Sys

一个初中生到程序员的辛酸经历

一个初中生到程序员的辛酸经历 转自木板 前言:我将写下一个穷苦家庭的农村孩子的经历.我念书不多,文笔不好,基本上是流水式的叙述,大家多多见谅.如果你现在年轻或迷惘,那你看下这篇文章或许有帮助.如果你想了解社会的底层,也可以看看本文.在这篇文章里我会写一些我对人生的看法,希望可以给各位参考参考. 我今年二十八岁,个子不高,长得还算端正.在学校受的教育不高,就读到初中二年级下学期.   我干过很多行业,学过厨师,学过装修,做过酒店服务员,送过报纸.可以说在在社会底层的经历十分的丰富.后来参加自考拿了

一个带单位的文本框

一个带单位的文本框,文本框和单位长度自适应 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style> </style> </head> <body> <div style="width:200px;d

为什么一个java源文件中只能有一个public类

问题:一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 答案:可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致.一个文件中可以只有非public类,如果只有一个非public类,此类可以跟文件名不同. 为什么一个java源文件中只能有一个public类? 在java编程思想(第四版)一书中有这样3段话(6.4 类的访问权限): 1.每个编译单元(文件)都只能有一个public类,这表示,每个编译单元都有单一的公共接口,用pub

1.3—一个典型的JAVA程序的编写和运行过程

JAVA语言应用范围 桌面应用编程 WEB客户端编程 WEB服务器编程 手机编程 机器人编程 第一个JAVA程序 JAVA开发环境搭建 下载:Download J2SDK (Java  2 Software  Development Kit) from http://java.sun.com 安装:run the executable(跟普通软件安装一样,点击下一步就OK!)  环境变量配置: 环境变量(就是为相关命令提供一个路径信息,告诉他到哪里去找相关文件信息): 设置: 新增系统环境变量J