测试程序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的对比:

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. [Erlang 0113] Elixir 编译流程梳理

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

  2. Gcc的编译流程分为了四个步骤:

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

  3. [uboot] (第四章)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. [uboot] (第四章)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. const 使用一二

    Primer C++ 练习题4.20: int i = -1; const int ic = i; 对于这个,一开始认为,ic 作为const 类型变量,定义时应该给其赋常值,而此处给的是变量i,因此 ...

  2. setView的AlertDialog在受到二次点击后出错

    错误报告: 10-21 13:11:16.009: E/AndroidRuntime(27937): FATAL EXCEPTION: main10-21 13:11:16.009: E/Androi ...

  3. MAC下使用Charles抓取安卓模拟器数据

    一.安装Charles,这个不多记录 二.Charles数据乱码问题(参照这篇文章 http://blog.csdn.net/huanghanqian/article/details/52973651 ...

  4. ajax函数封装

    function ajax(url, fnSucc, fnFaild) { //1.创建Ajax对象 if(window.XMLHttpRequest)//必须加window否则ie报错 { var ...

  5. JS中的柯里化与反柯里化

    先占个位 看了一天折资料,感觉清楚多了

  6. 使用pip安装BeautifulSoup4模块

    1.测试是否安装了BeautifulSoup4模块 import bs4 print bs4 执行报错说明没有安装该模块 Traceback (most recent call last): File ...

  7. 对 griview获取的数据添加方法 6月

    <asp:TemplateField HeaderText="日期">                            <HeaderStyle CssCl ...

  8. IOS第一天-新浪微博 - 框架的搭建

    *************HWAppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWith ...

  9. SQL Server复制出错文章集锦

    SQL Server复制出错文章集锦 为了方便大家对数据库复制过程中出错的时候更好地解决问题 本人收集了SQL Server相关复制出错解决的文章   The process could not ex ...

  10. 使用ReSharper打造团队代码检查流程

    首先我想跟大家分享一下我们团队的代码检查流程. 1. 项目经理随时会检查成员的代码,如果发现有不符合规范的代码,会在注释里面加todo.比如,假设leo的代码不符合规范,那么项目经理就会加注释: // ...