g++编译流程
测试程序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++编译流程的更多相关文章
- [Erlang 0113] Elixir 编译流程梳理
注意:目前Elixir版本还不稳定,代码调整较大,本文随时失效 之前简单演示过如何从elixir ex代码生成并运行Erlang代码,下面仔细梳理一遍elixir文件的编译过程,书接上文,从 ...
- Gcc的编译流程分为了四个步骤:
http://blog.csdn.net/xiaohouye/article/details/52084770(转) Gcc的编译流程分为了四个步骤: 1.预处理,生成预编译文件(.文件): Gcc ...
- [uboot] (第四章)uboot流程——uboot编译流程
http://blog.csdn.net/ooonebook/article/details/53000893 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...
- win10 x64 VS2017 PJSIP 视频通话编译流程
win10 x64 VS2017 PJSIP 视频通话编译流程 1. 下载PJSIP源码 PJSIP源码下载地址:https://www.pjsip.org/ 2. 阅读一遍官方的文档 文档地址:ht ...
- GCC编译流程浅析
GCC-GCC编译流程浅析 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙 ...
- GCC 编译流程简介
GCC-GCC编译流程 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙全套 ...
- [uboot] (第四章)uboot流程——uboot编译流程 (转)
以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例 [uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(B ...
- gcc 的编译流程 和gdb的调试方法
GCC的编译流程分为四个步骤: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) 可以看的出来文件大小 gdb 调试 gdb - ...
- 编译流程,C开发常见文件类型名
编译流程 我们常说的编译是一个整体的概念,是指从源程序到可执行程序的整个过程,实际上,C语言编译的过程可以进一步细分为预编译->编译->汇编->链接 预编译是把include关键字所 ...
随机推荐
- const 使用一二
Primer C++ 练习题4.20: int i = -1; const int ic = i; 对于这个,一开始认为,ic 作为const 类型变量,定义时应该给其赋常值,而此处给的是变量i,因此 ...
- setView的AlertDialog在受到二次点击后出错
错误报告: 10-21 13:11:16.009: E/AndroidRuntime(27937): FATAL EXCEPTION: main10-21 13:11:16.009: E/Androi ...
- MAC下使用Charles抓取安卓模拟器数据
一.安装Charles,这个不多记录 二.Charles数据乱码问题(参照这篇文章 http://blog.csdn.net/huanghanqian/article/details/52973651 ...
- ajax函数封装
function ajax(url, fnSucc, fnFaild) { //1.创建Ajax对象 if(window.XMLHttpRequest)//必须加window否则ie报错 { var ...
- JS中的柯里化与反柯里化
先占个位 看了一天折资料,感觉清楚多了
- 使用pip安装BeautifulSoup4模块
1.测试是否安装了BeautifulSoup4模块 import bs4 print bs4 执行报错说明没有安装该模块 Traceback (most recent call last): File ...
- 对 griview获取的数据添加方法 6月
<asp:TemplateField HeaderText="日期"> <HeaderStyle CssCl ...
- IOS第一天-新浪微博 - 框架的搭建
*************HWAppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWith ...
- SQL Server复制出错文章集锦
SQL Server复制出错文章集锦 为了方便大家对数据库复制过程中出错的时候更好地解决问题 本人收集了SQL Server相关复制出错解决的文章 The process could not ex ...
- 使用ReSharper打造团队代码检查流程
首先我想跟大家分享一下我们团队的代码检查流程. 1. 项目经理随时会检查成员的代码,如果发现有不符合规范的代码,会在注释里面加todo.比如,假设leo的代码不符合规范,那么项目经理就会加注释: // ...