g++编译流程

时间:2023-01-04 13:27:34

测试程序test.cpp如下所示:

#include <iostream>
using namespace std;
#define MAX 9
int main()
{
//just for test
cout << MAX << endl;
cout << "Hello world!" << endl;
}

g++编译主要分为四个阶段进行,即预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。

1.预处理

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

g++的-E选项,可以让编译器在预处理后停止,并输出预处理结果;输出的test.i文件中存放着test.cpp经预处理之后的代码;也可以通过g++ -E test.cpp直接在命令行窗口中输出预处理后的代码;

如下图所示,在本例中,预处理结果就是将iostream文件(路径为/usr/include/c++/4.8)中的内容插入到test.cpp中,还会做宏的替换、注释的消除;

iostream与test.i的对比:

g++编译流程

test.i文件最后的部分:

# 2 "test.cpp" 2
using namespace std; int main()
{
//消除注释
cout << 9 << endl;//宏替换
cout << "Hello world!" << endl;
}

2.编译

预处理之后,可以直接对生成的test.i文件进行编译,生成汇编代码:

g++ -S test.i -o test.s

g++的-S选项,表示在程序编译期间,在生成汇编代码后停止,-o输出汇编代码文件;

3.汇编

对于编译生成的汇编代码文件test.s,gas汇编器负责将其编译为目标文件,

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

4.连接

g++链接器是gas提供,负责将程序的目标文件与所依赖的所有附加目标文件连接起来,最终生成可执行文件,附加目标文件依赖静态连接库(.a或者.lib)和动态连接库(.so或.dll)。

对于汇编生成的test.o,将其与C++标准输入输出库进行连接,最终生成可执行程序test。

g++ test.o -o test

在命令行窗口中,执行./test,即可输出:

9
Hello world!

5.多个文件的编译

6.库文件连接

7.g++与gcc的联系和区别

g++编译流程的更多相关文章

  1. &lbrack;Erlang 0113&rsqb; Elixir 编译流程梳理

    注意:目前Elixir版本还不稳定,代码调整较大,本文随时失效      之前简单演示过如何从elixir ex代码生成并运行Erlang代码,下面仔细梳理一遍elixir文件的编译过程,书接上文,从 ...

  2. Gcc的编译流程分为了四个步骤&colon;

    http://blog.csdn.net/xiaohouye/article/details/52084770(转) Gcc的编译流程分为了四个步骤: 1.预处理,生成预编译文件(.文件): Gcc ...

  3. &lbrack;uboot&rsqb; (第四章)uboot流程——uboot编译流程

    http://blog.csdn.net/ooonebook/article/details/53000893 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...

  4. win10 x64 VS2017 PJSIP 视频通话编译流程

    win10 x64 VS2017 PJSIP 视频通话编译流程 1. 下载PJSIP源码 PJSIP源码下载地址:https://www.pjsip.org/ 2. 阅读一遍官方的文档 文档地址:ht ...

  5. GCC编译流程浅析

    GCC-GCC编译流程浅析 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙 ...

  6. GCC 编译流程简介

    GCC-GCC编译流程 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙全套 ...

  7. &lbrack;uboot&rsqb; (第四章)uboot流程——uboot编译流程 (转)

    以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例 [uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(B ...

  8. gcc 的编译流程 和gdb的调试方法

    GCC的编译流程分为四个步骤: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) 可以看的出来文件大小 gdb 调试 gdb - ...

  9. 编译流程,C开发常见文件类型名

    编译流程 我们常说的编译是一个整体的概念,是指从源程序到可执行程序的整个过程,实际上,C语言编译的过程可以进一步细分为预编译->编译->汇编->链接 预编译是把include关键字所 ...

随机推荐

  1. Android安全开发之ZIP文件目录遍历

    1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在“../”的字符串,攻击者可以利用多个“../”在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件.如果被覆盖掉的文件是动态链接s ...

  2. 浅谈移动端之touch事件--手指的滑动事件

    今天台风‘海马’袭击深圳,全市停工.现分享一篇关于touch的文章,望指教! 原理: 当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY: 当触发touch ...

  3. 青蛙的约会 java版

    参考http://blog.csdn.net/polossk/article/details/9799735 package acm; public class FrogDate { public s ...

  4. &sol;proc&sol;cpuinfo zz

    /proc/cpuinfo文件分析 在Linux系统中,提供了proc文件系统显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以通过/proc/cpuinfo文件得到.本文章针 ...

  5. 卸载RedHat7自带的yum,安装并使用网易163源

    由于redhat的yum在线更新是收费的,如果没有注册的话不能使用,如果要使用,需将redhat的yum卸载后,安装CentOS yum工具,再配置其他源,以下为详细过程: 删除redhat原有的yu ...

  6. javascript 关闭窗口,弹出新窗口并带有确认关闭对话框解决办法

    在很多人眼里,北京是一个物欲横流的社会,生活节奏之快,让你一丝都不能停下来,走在路上伴随着人群急速往前涌,或许有些人都不知道要去哪.也不知道自己想要的是什么?在一个浮躁的社会里,多了一些浮躁的人,到处 ...

  7. linux下搭建SVN服务器完全手册-很强大!!!!!

    系统环境        RHEL5.4最小化安装(关iptables,关selinux) + ssh + yum 一,安装必须的软件包.        yum install subversion ( ...

  8. Block高级用法:Block传值UI&lowbar;12&lpar;3&rpar;

    1.简单复习Block的定义.赋值.调用做学习传值铺垫: //声明一个函数 无返无参void printfHello(int a);//函数的实现void printfHello(int a){    ...

  9. 第33章:MongoDB-索引--GridFS存储文件

    ①简介 GridFS是MongoDB用来存储大型二进制文件的一种存储机制.特别适合用在存储一些不常改变,但是经常需要连续访问的大文件的情况. ②GridFS的优点 1:能够简化技术栈,如果已经使用了M ...

  10. 【POJ1734】Sightseeing Trip 无向图最小环

    题目大意:给定一个 N 个顶点的无向图,边有边权,如果存在,求出该无向图的最小环,即:边权和最小的环,并输出路径. 题解:由于无向图,且节点数较少,考虑 Floyd 算法,在最外层刚开始遍历到第 K ...