使用g++编译c/c++程序时,假设程序无错,我们通常直接使用以下命令:
001
|
g++
hello.cpp
|
这样系统会自动生成默认可执行文件a.out.
或者使用
001
|
g++
-o hello hello.cpp
|
则会生成一个可执行文件hello.
同时我相信很多人使用Visual C++时候,都是直接点击Run或者Debug,然后去看返回的错误,至于是哪个过程出错了,有很多人根本没有试过去搞明白,他们习惯去折腾代码本身而对编译器做了什么一无所知,我认为这样的编程习惯是糟糕的,即使你是VC或者其它IDE使用者,不需要自行编写makefile文件,也应当搞清楚自己所写的程序是如何的一个编译过程.
上图中这一命令虽然简单,实际上却包含了数个过程,这里我们不像讲解编译原理一样去分析C++程序的编译过程,在这里我们可以分解为四个步骤:
- 预处理(Prepressing)
- 编译(compilation)
- 汇编(Assembly)
- 链接(Linking)
一 . 预处理的过程主要处理包括以下过程:
- 将所有的#define删除,并且展开所有的宏定义
- 处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等
- 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。
- 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
- 保留所有的#pragma编译器指令,因为编译器需要使用它们
通常使用以下命令来进行预处理:
001
|
g++
-E hello.c -o hello.i
|
参数-E表示只进行预处理或者也可以使用以下指令完成预处理过程
cpp hello.c > hello.i
直接cat hello.i你就可以看到预处理后的代码
二. 编译的过程
就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码.
使用以下命令进行编译:
001
|
g++
-S hello.i -o hello.s
|
编译后的程序hello.s是一个汇编语言的程序,你可以打开看看里面的内容是各种类似于mov,sub之类的汇编指令.
三 . 汇编的过程
则是将汇编代码转换成机器可以执行的指令,我们通过调用汇编器as来完成
001
|
as
hello.s -o hello.o
|
或者使用以下命令也行,g++会自动调用as程序
001
|
g++
-c hello.s -o hello.o
|
汇编将输出一个目标文件hello.o
四.链接的过程
则通过调用链接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件.
在这里顺便讲一下静态链接和动态链接的概念。静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大.而动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去.
本文只是很粗略地介绍了一下这个过程,之后也会就每个环节深入的研究,文章中若有不妥之处,还敬请留言指出.
相关推荐
本篇文章是博主在学习c++基础时所做第一篇笔记,适用于有一定c++学习基础的同学,有些地方是按照自己的学习习惯所作,...c++基础笔记:预处理命令、命名空间、转义字符、输入输出、数据类型、算数运算符、类型转换等。
C++程序设计:第十章 编译预处理.ppt
适合初学C语言C++的小白,帮助你快速理解这两种语言的基础知识。内含练习项目哦。
/*本程序开源 * 作者QQ570176391,78442761 * * 博客http://blog.csdn.net/qq78442761 * * *此源码在博客有对应博文 * * */
Duanxx的C++学习:预处理指令 #pragma
c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结 c/c++博客笔记pdf总结
程序编译的大体流程:预处理——编译——汇编——链接 主要动作:宏的替换,还有注释的消除,还有找到相关的库文件 gcc/g++ -E Test.cpp 编译 主要动作:将预处理后的文件转换为汇编文件,里面为汇编指令 gcc/g++ -S...
SegY地震体数据可视化分析工具 开发笔记 1 http://blog.csdn.net/sdust_dx/article/details/9312019 SegY地震体数据可视化分析工具 开发笔记 2 http://blog.csdn.net/sdust_dx/article/details/9345091 SegY地震体...
《C++游戏开发》笔记十一 平滑动画 源代码 欢迎大家阅读配套博文 http://blog.csdn.net/u011371356/article/details/9430645
http://images.enet.com.cn/eschool/c++/1/1C++简介.swf http://images.enet.com.cn/eschool/c++/1/2C++的发展过程.swf http://images.enet.com.cn/eschool/c++/1/3C++与C有什么不同.swf ...
经典游戏-扫雷游戏C++源码 @或直接从这里寻找@ http://download.csdn.net/user/cleopard/album @更多@ http://cleopard.download.csdn.net/ 福利 http://xuemeilaile.com 17份软件测试文档 ...
C++贪吃蛇游戏源码 @或直接从这里寻找@ http://download.csdn.net/user/cleopard/album @更多@ http://cleopard.download.csdn.net/ 福利 http://xuemeilaile.com 17份软件测试文档 ...
C++拼图游戏源码 @或直接从这里寻找@ http://download.csdn.net/user/cleopard/album @更多@ http://cleopard.download.csdn.net/ 福利 http://xuemeilaile.com 17份软件测试文档 ...
3GeeksforgeeksUrl:https://ide.geeksforgeeks.org/Geeksforgeeks 的编译器支持 C++14,它具有代码
C++编译预处理,关于C++学习的课件,可以帮助C++的学习
https://www.bilibili.com/video/BV1et411b73Z 该C++视频的笔记(该笔记是.md文档的,建议下载一个Typroa)
各版本编译库手动下载,用此工具一次搞定 Microsoft Visual C++ 2005 Redistributable Package (x86) https://www.microsoft.com/zh-cn/download/details.aspx?id=3387 Microsoft Visual C++ 2005 Redistributable ...
C++源码,可直接在编译器运行,结构完整,原题可参见http://bailian.openjudge.cn/practice/3750/,北京大学程序设计实习课程作业
《高质量程序设计指南:C++/C语言(第3版)》以轻松幽默的笔调向读者论述了高质量软件开发方法与C++/C编程规范,而这也是作者多年从事软件开发工作的经验总结。全书共17章,第1章到第4章重点介绍软件质量和基本的...
第1章:http://blog.csdn.net/musicvs/article/details/8440707 第2章:http://blog.csdn.net/musicvs/article/details/8440919 第3章:http://blog.csdn.net/musicvs/article/details/8445027 第4章:...