linux 分步编译命令,GCC分步编译C++程序(汇总版)
通过前面几节的讲解,已经就 gcc(g++)指令可用的 -E、-S、-c 以及 -o 选项的功能和用法做了详细的讲解。在此基础上,本节将对“如何分步编译C/C++程序”这个问题做一个完整的解答。
接下来,我将以 g++ 指令分别对 C++ 源程序做预处理、编译、汇编和链接操作为例,完整地给读者演示如何分步编译源代码程序。样例程序如下:
//位于 demo.cpp 文件中
#include
using namespace std;
int main(){
cout << "GCC教程:http://c.biancheng.net/gcc/" << endl;
return 0;
}
GCC分步编译C++源程序
1) 预处理
通过给 g++ 指令添加 -E 选项,即可轻松实现令 GCC 编译器只对目标源程序进行预处理操作。比如:
[root@bogon demo]# g++ -E demo.cpp -o demo.i
[root@bogon demo]# ls
demo.cpp demo.i
注意,由于编译阶段需要用到预处理的结果,因此这里必须使用 -o 选项将该结果输出到指定的 demo.i 文件中(Linux 系统中,通常用 ".i" 或者 ".ii" 作为 C++ 程序预处理后所得文件的后缀名)。
感兴趣的读者可自行运行 cat demo.i 指令查看 demo.i 文件中的内容。
2) 编译
值得一提的是,编译阶段针对的将不再是 demo.cpp 源文件,而是 demo.i 预处理文件。对预处理文件进行编译操作,实际上就是对 demo.i 文件做进一步的语法分析,并生成对应的汇编代码文件(Linux 发行版通常以 ".s" 作为其后缀名)。
通过给 g++ 指令添加 -S 选项,即可令 GCC 编译器仅对指定预处理文件做编译操作。例如:
[root@bogon demo]# g++ -S demo.i
[root@bogon demo]# ls
demo.cpp demo.i demo.s
和预处理阶段不同,即便这里不使用 -o 选项,编译结果也会输出到和预处理文件同名(后缀名改为 .s)的新建文件中。
3) 汇编
汇编阶段就是将之前生成的汇编代码文件(demo.s)做进一步转换,生成对应的机器指令。通过给 g++ 指令添加 -c 选项,即可令 GCC 编译器仅对指定的汇编代码文件做汇编操作。
例如:
[root@bogon demo]# g++ -c demo.s
[root@bogon demo]# ls
demo.cpp demo.i demo.o demo.s
显然,默认情况下汇编操作会自动生成一个和汇编代码文件名称相同、后缀名为 .o 的二进制文件(又称为目标文件)。
4) 链接
目标文件已经是二进制文件,与可执行文件的组织形式类似,只是有些函数和全局变量的地址还未找到,因此还无法执行。链接的作用就是找到这些目标地址,将所有的目标文件组织成一个可以执行的二进制文件。
完成链接操作,并不需要给 g++ 添加任何选项,只要将汇编阶段得到的 demo.o 作为参数传递给它,g++就会在其基础上完成链接操作。例如:
[root@bogon demo]# g++ demo.o
[root@bogon demo]# ls
a.out demo.cpp demo.i demo.o demo.s
在链接阶段,如果不使用 -o 选项将执行结果输出到指定文件,则 g++ 会默认创建一个名为 a.out 的可执行文件,并将执行结果输出到该文件中。
经过以上 4 步,最终生成了 a.out 可执行文件,我们可以尝试运行该文件,查看其结果是否正确:
[root@bogon demo]# ./a.out
GCC教程:http://c.biancheng.net/gcc/
显然,该结果和我们的预期相符。
除此之外,如果读者不想执行这么多条指令,但想获得预处理、编译、汇编以及链接这 4 个过程产生的中间文件,可以执行如下指令:
[root@bogon demo]# g++ demo.cpp -save-temps
[root@bogon demo]# ls
a.out demo.c demo.cpp demo.ii demo.o demo.s
可以看到,通过给 g++ 添加 -save-temps 选项,可以使 GCC 编译器保留编译源文件过程中产生的所有中间文件。
linux 分步编译命令,GCC分步编译C++程序(汇总版)相关推荐
- mysql.h 动态编译命令_Linux环境编译动态库和静态库总结
对Linux环境动态库和静态库的一些基础知识做一些总结, 首先总结静态库的编译步骤. 1 先基于.cpp或者.c文件生成对应的.o文件 2将几个.o文件 使用ar -cr命令 生成libname.a文 ...
- linux qt编译命令,linux下使用命令模式去编译Qt程序
1.打开终端输入,qmake -v ,如果提示版本信息正,就可以编译程序了. 2.当前目录切换到程序源代码目录,cd /home/likewei/untitled2 3.生成untitled2.pro ...
- ide在控制台输入编译命令_快速编译调试 Redis
一:开篇 Redis 它是个宝,男女老少都说好.秒杀限流分布式,什么需求都能搞. Redis 主要的用途是分布式缓存,其实不用我多介绍,相信大家都用过Redis.之前也看过不少Redis的书,其中就包 ...
- Linux中gcc的编译、静态库和动态库的制作
欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...
- GCC的编译和调试--入门介绍
编译与调试 1.1编译的概念和理解 在进行C程序开发时,编译就是将编写的C语言代码变成可执行程序的过程,这一过程 是由编译器来完成的.编译器就是完成程序编译工作的软件,在进行程序编译时完成了一系 列复 ...
- mtk平台android编译命令,MTK 常见的编译命令
1: ./mk n(r) kernel; ./mk bootimage;当修改build-in 到kernel相关代码时,要使用此命令,具体文件参考如下: alps/kernel/ alps/medi ...
- SourceInsight4.0自定义编译命令
Source Inside(SI)是一款面向项目开发的程序编辑器和代码浏览器,它提供了一个视图将分散在各个地方的代码汇合在一起形成一个虚拟的整体,供开发者方便地阅读和编辑.关于其使用介绍可以参看链接[ ...
- Android 系统(182)---Android.mk的用法和基础 amp;amp; m、mm、mmm编译命令
Android.mk的用法和基础 && m.mm.mmm编译命令 一个Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分, ...
- Android.mk的用法和基础 m、mm、mmm编译命令
一个 Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次.你可以在每一个Android.mk file中定义一 ...
最新文章
- python使用matplotlib可视化堆积的折线图、使用stackplot函数可视化堆积的折线图、不同数据在垂直方向堆叠
- Visual studio 快捷键大全
- 基于cookies的小型购物车程序
- XSSFORK:新一代XSS自动扫描测试工具(精)
- 解析Java内存区域
- NYOJ-86 找球号(一)
- 链表:从尾到头打印链表
- Android和ios的区别
- 【计算机网络】(谢希仁)第七版答案
- 定向士官学计算机网络技术可以吗,山东信息职业技术学院2016年定向培养士官招生问答...
- ubuntu 无法定位软件包
- PMP之采购管理过程组中的合同类型辨析
- 【解决办法】ES文件浏览器无法播放该链接
- 华为p10 android几,是运行速度最快的安卓手机? 华为P10
- h5页面启动安卓应用_h5启动原生APP总结
- 屏蔽无法验证发行者,你确实要运行此软件吗?的提示
- elementUI表格动态渲染错乱
- 芝加哥大学计算机科学,芝加哥大学计算机科学
- 牛客网50道选择题(1)
- 清华大学地学系全球超分3弧秒海陆DEM数据下载
热门文章
- java实现鸭子类型,Golang的interface及duck typing鸭子类型
- MySql 服务名无效
- python实例 97,98
- PHP在哪里执行_php文件放在哪运行
- java常用的缓存_java 常用缓存 - 只对肉有感觉的个人空间 - OSCHINA - 中文开源技术交流社区...
- 【youcans 的 OpenCV 例程 200 篇】107. 退化图像的维纳滤波
- 【OpenCV 例程200篇】50. 图像增强—直方图统计量图像增强
- Python数模笔记-NetworkX(4)最小生成树
- 惯性矩和偏心距描述器
- android progressbar 水平动画,Android ProgressBar 自定义样式(三),动画模式