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 编译器保留编译源文件过程中产生的所有中间文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 安装u盘软件,Universal USB Installer:帮你用U盘装Linux

近期&#xff0c;Linux系统U盘制作安装工具&#xff1a;Universal USB Installer迎来了v1.9.5.1版本&#xff0c;新版支持了OpenSuse 32/64bit系统平台&#xff0c;欢迎Linux桌面爱好者下载使用。Universal USB Installer工具&#xff0c;类似一款U盘制作工具&#xff0c;允许用…

lucene 高亮显示

原文地址&#xff1a; http://blog.csdn.net/javaman_chen/article/details/8224407 Lucene针对高亮显示功能提供了两种实现方式,分别是Highlighter和FastVectorHighlighter。 顾名思义&#xff0c;FastVectorHighlighter较Highlighter速度更快&#xff0c;功能也更强大&…

linux rsync 安装教程,linux下的rsync配置和使用教程

本试验的测试环境使用的系统是Redhat AS4(2台&#xff0c;一个服务端&#xff0c;一个客户端)rsync服务端的ip&#xff1a;192.168.23.102rsync客户端的ip&#xff1a;192.168.23.100&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&am…

u盘 轻量linux,3种方法来创建轻量、持久化的Xubuntu Linux USB系统盘

使用Universal USB Install创建持久化USB XUbuntu系统盘这个教程为你介绍如何使用Xubuntu Linux创建一个轻量并且持久化的Linux USB系统盘。译者注&#xff1a;持久化Linux USB系统盘(Persistent Linux USB drive)&#xff0c;安装在优盘的Linux系统&#xff0c;允许用户保存数…

linux u盘加载阵列卡驱动步骤,Linux U盘加载阵列卡驱动步骤

如果没有Linux的机器,可以使用安装光盘的Linux环境&#xff1a;将 U 盘完全慢速格式化&#xff0c;将驱动拷贝到U盘&#xff0c;将U盘插在服务器上&#xff0c;用Linux安装光盘第一张启动到图形安装界面&#xff0c;按Ctrl&#xff0b;Alt&#xff0b;F2切换到控制台。按F11调用…

linux 笔记本键盘灯驱动程序,安装和使用CKB Next在Linux上更改Corsair键盘背光设置...

本文介绍在Ubuntu、Debian、Arch Linux、Fedora、OpenSUSE系统下安装和使用CKB Next的方法&#xff0c;以在Linux系统上更改Corsair键盘背光设置。Corsair键盘非常适合在PC上进行游戏&#xff0c;特别是在夜间&#xff0c;因为它们具有出色的RGB背光功能&#xff0c;用户可以轻…

15.6.6-sql字符串组装技巧

组装sql字符串&#xff0c;丢给exec sp_executesql执行 exec sp_executesql Nexec sp_executesql Nselect * from TESTTEST.dbo.Employees where Titletitle, Ntitle varchar(30), titleEmployee 注意&#xff1a;这里是执行一个带有输入参数的sql语句&#xff0c;用两层exec s…

c++ linux 环境,C++ 环境设置

C 环境设置本地环境设置如果您想要设置 C 语言环境&#xff0c;您需要确保电脑上有以下两款可用的软件&#xff0c;文本编辑器和 C 编译器。文本编辑器这将用于输入您的程序。文本编辑器包括 Windows Notepad、OS Edit command、Brief、Epsilon、EMACS 和 vim/vi。文本编辑器的…

linux内核udp校验和计算函数,Linux 内核IP和UDP检验和计算

IP checksuma.接收报文struct iphdr *iph ip_hdr(skb);if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))goto checksum_error;b.发送报文ip_send_check(iph);{iph->check 0&#xff1b;iph->check ip_fast_csum((unsigned char *)iph, iph->ihl);}UDP checksu…

各种类型的转换

int.parse() float.parase() double.parse()这些都可以把字符串类型转换为数值类型 **.ToString();把各种类型转换为字符串类型 &#xff08;int&#xff09;**代表类型之间的转换有显示转换&#xff0c;也有隐形转换&#xff0c;这种只限于数值之间的转换&#xff0c;即想转换…

stol函数在linux下使用,Linux下ATT汇编语法简介一

这显得很古怪&#xff0c;不过在gcc知道程序员拿这些寄存器做些什么后&#xff0c;这确实能够对gcc的优化操作有所帮助。表5-3中是一些可能会用到的寄存器加载代码及其具体的含义。表5-3 常用寄存器加载代码说明代 码说 明代 码说 明a使用寄存器eaxm使用内存地址b使用寄存器ebx…

linux安装pgsql源码包解压,在Linux(centos)中使用源码安装pgRouting

目录一、解压pgRouting二、配置PostgreSQL的环境变量三、编译源代码四、测试由于pgRouting依赖于PostGIS和PostgreSQL&#xff0c;所以阅读本文之前&#xff0c;务必请先阅读&#xff1a;Linux(centos)中使用源码安装PostgreSQLLinux(centos)中使用源码安装PostGIS按照以上文章…

clientX和clientY属性需要注意的地方

clientX和clientY为可视区鼠标的位置。 1. 随鼠标移动的div块[runjs] 当document有多个页面时&#xff0c;会出现问题。[runjs] 2. 解决方案&#xff1a;scrollTop, scrollLeft 需要注意scrollTop/scrollLeft的兼容性获取&#xff1b; scrollTop document.documentElement.scr…

Android无线测试之—UiAutomator UiObject API介绍二

点击与长按 一、组件区域位置关系 Rect 对象代表一个矩形区域 [Left,Top] [Right,Bottom] 二、点击与长按API 返回值API描述booleanclick()点击对象booleanclickAndWaitForNewWindow(lang timeout)点击对象&#xff0c;等待新窗口出现&#xff0c;参数为等待超长时间booleancli…

linux系统存储文件系统,Linux文件系统的深入分析

【IT168 技术】本人很喜欢Linux&#xff0c;在工作中也很喜欢总结关于Linux文件系统的经验&#xff0c;下面就这个问题来详细说说吧。Linux支持多种文件系统&#xff0c;包括ext2、iso9660、jffs、ext3、vfat、ntfs、romfs和nfs等&#xff0c;为了对各类文件系统进行统一管理&a…

Path Sum I, II

简单题 I Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. For example:Given the below binary tree and sum 22, 5/ \4 8/ / \11 13 4/ \ \7 2 …

【Python】进程和多进程的使用

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、进程1.概念理解2.进程的启动3.python进程 二、多进程 前言 进程是指计算机中正在运行的程序实例。 进程可以是操作系统分配的&#…

linux 设置dns缓存周期,如何解决DNS缓存时间问题

理想情况下&#xff0c;各地DNS的缓存时间即为设置的ttl时间&#xff0c;所以可以通过设置ttl时间来控制DNS缓存的时间。ttl时间设置的短&#xff0c;DNS缓存过期快&#xff0c;在机器故障的时候很快切换&#xff0c;对用户的影响小&#xff1b;但是由于ttl设置的太短&#xff…

linux wifi pro6818,GEC6818连接Ubuntu,下载程序至开发板

windows下使用tftp工具下载文件到开发板&lpar;linux&rpar;1.下载tftp工具,也可以上CSDN找个免费0积分的 http://www.52z.com/soft/11886.html 2.确保开发板和windows在同一网段 比如192.168.101.*段 ...stm32串口烧写程序到开发板前言:我们如果要断电后重启板子还能使用…

表单-图片浏览上传-单选框(二)

一、图片浏览上传 1、依然【table】标签包含&#xff0c; 2、【input】包含了【type】等于【file】。 <table border"1" align"center"><tr><td>图片上传</td><td><input type"file"</td></tr><…