GCC编译器编译C/C++程序(一步完成、分步完成)

news2024/11/17 23:51:47

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。

一、编译的流程

编译C/C++ 程序,是指将C/C++源代码转变为可执行程序。

这需要经历4个过程:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。

二、一步完成编译

GCC 编译器并未提供给用户可用鼠标点击的界面窗口,要想调用 GCC 编译器编译 C 或者 C++ 程序,只能通过执行相应的 gcc 或者 g++ 指令。使用 GCC 编译器编译 C 或者 C++ 程序,也必须要经历上述的 4 个过程。但考虑在实际使用中,用户可能并不关心程序的执行结果,只想快速得到最终的可执行程序,因此 gcc 和 g++ 都对此需求做了支持。

如下所示,运行C文件demo.c与C++文件demo.cpp的一步完成编译的指令,GCC 编译器就会在当前目录下生成对应的可执行文件,该文件的名称为 a.out,或者使用-o 选项指定要生成的文件名。

xjh@ubuntu:~/iot/tmp$ gcc demo.c
xjh@ubuntu:~/iot/tmp$ g++ demo.cpp  #或者 gcc -xc++ -lstdc++ -shared-libgcc demo.cpp
xjh@ubuntu:~/iot/tmp$ gcc demo.c -o demo.exe
xjh@ubuntu:~/iot/tmp$ g++ demo.cpp -o democpp.exe # 或者 gcc -xc++ -lstdc++ -shared-libgcc demo.cpp -o democpp.exe

虽然仅有一条指令,但依然按照预处理、编译、汇编、链接的过程将 C 、C++ 程序转变为可执行程序的。

那些本应在预处理阶段、编译阶段、汇编阶段生成的中间文件,此执行方式默认是不会生成的,只会生成最终的 a.out 可执行文件(除非为 gcc 或者 g++ 额外添加 -save-temps 选项)

xjh@ubuntu:~/iot/tmp$ ls
demo.c
xjh@ubuntu:~/iot/tmp$ gcc demo.c
xjh@ubuntu:~/iot/tmp$ ls
a.out  demo.c 
xjh@ubuntu:~/iot/tmp$ gcc demo.c -save-temps
xjh@ubuntu:~/iot/tmp$ ls
a.out  demo.c  demo.i  demo.o  demo.s
xjh@ubuntu:~/iot/tmp$ 

三、分步编译程序

表1列出了实际使用 gcc 或者 g++ 指令编译 C/C++ 程序时,常用的一些指令选项。 

表 1 GCC常用的编译选项
gcc/g++指令选项功 能
-E预处理指定的源文件,不进行编译。
-S编译指定的源文件,不进行汇编。
-c编译、汇编指定的源文件,不进行链接。
-o指定生成文件的文件名。

-llibrary 或

-I library

其中 library 表示要搜索的库文件的名称。该选项用于手动指定链接环节中程序可以调用的库文件。建议 -l 和库文件名之间不使用空格,比如 -lstdc++。

-L/pathname该选项用于为GCC添加另一个搜索链接库的目录,其中pathname是链接库的路径。
-ansi对于 C 语言程序来说,其等价于 -std=c90;对于 C++ 程序来说,其等价于 -std=c++98。
-std=手动指令编程语言所遵循的标准,例如 c89、c90、c++98、c++11 等。

下面将以某个demo.cpp 源文件来说明如何分步编译一个C++程序。

1、预处理

通过给 g++ 指令添加 -E 选项,可实现令 GCC 编译器只对目标源程序进行预处理操作。

预处理,其实就是对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择、去掉空行与注释等等。

由于编译阶段需要用到预处理的结果,因此这里必须使用 -o 选项,将该结果输出到指定的 demo.i 文件中(Linux 系统中,通常用 ".i" 或者 ".ii" 作为 C++ 程序预处理后所得文件的后缀名)。

xjh@ubuntu:~/iot/tmp$ ls
demo.cpp
xjh@ubuntu:~/iot/tmp$ g++ -E demo.cpp -o demo.i
xjh@ubuntu:~/iot/tmp$ ls
demo.cpp  demo.i
xjh@ubuntu:~/iot/tmp$ 

2、编译

通过给 g++ 指令添加 -S 选项,即可令 GCC 编译器仅对指定预处理文件做编译操作。

编译,其实就是对 demo.i 文件做进一步的语法分析,并生成对应的汇编代码文件(Linux 发行版通常以 ".s" 作为其后缀名)。

即便不使用 -o 选项,编译结果也会输出到和预处理文件同名(后缀名改为 .s)的新建文件中。

xjh@ubuntu:~/iot/tmp$ g++ -S demo.i 
xjh@ubuntu:~/iot/tmp$ ls
demo.cpp  demo.i  demo.s
xjh@ubuntu:~/iot/tmp$ 

3、汇编

通过给 g++ 指令添加 -c 选项,即可令 GCC 编译器仅对指定的汇编代码文件做汇编操作。

汇编阶段就是将之前生成的汇编代码文件(demo.s)做进一步转换,生成对应的机器指令。

默认情况下汇编操作会自动生成一个和汇编代码文件名称相同、后缀名为 .o 的二进制文件(又称为目标文件)。

xjh@ubuntu:~/iot/tmp$ g++ -c demo.s
xjh@ubuntu:~/iot/tmp$ ls
demo.cpp  demo.i  demo.o  demo.s
xjh@ubuntu:~/iot/tmp$

4、链接

目标文件已经是二进制文件,与可执行文件的组织形式类似,只是有些函数和全局变量的地址还未找到,因此还无法执行。链接的作用就是找到这些目标地址,将所有的目标文件组织成一个可以执行的二进制文件。它必须把符号(变量名、函数名等一些列标识符)用对应的数据的内存地址(变量地址、函数地址等)替代,以完成程序中多个模块的外部引用。

完成链接操作并不需要给 g++ 添加任何选项,只要将汇编阶段得到的 demo.o 作为参数传递给它,g++就会在其基础上完成链接操作(GCC 默认会链接 libc.a 或者 libc.so,但是对于其他的库,例如非标准库、第三方库等,就需要手动添加。)

如果不使用 -o 选项将执行结果输出到指定文件,则默认创建一个名为 a.out 的可执行文件,并将执行结果输出到该文件中。

xjh@ubuntu:~/iot/tmp$ g++ demo.o
xjh@ubuntu:~/iot/tmp$ ls
a.out  demo.cpp  demo.i  demo.o  demo.s
xjh@ubuntu:~/iot/tmp$ g++ demo.o -o demo.exe
xjh@ubuntu:~/iot/tmp$ ls
a.out  demo.cpp  demo.exe  demo.i  demo.o  demo.s
xjh@ubuntu:~/iot/tmp$ 

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

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

相关文章

一次线上事故排查

问题3月1日监控系统监测到某子系统所在机器Cpu突然飙升。排查系统首先登录对应系统的机器,top查看机器信息,显示当前cpu已经到了800%top 显示800%根据top的pid查看对应服务,查看服务子进程排查子线程,发现子线程有8个都100%了&…

ESP32通过HTTP及SNTP同步网络时间

1、获取毫秒级时间 和普通系统函数相同 int get_sys_time_ms(void) {struct timeval tv_now;gettimeofday(&tv_now, NULL);int64_t time_us (int64_t)tv_now.tv_sec * 1000000L (int64_t)tv_now.tv_usec;return (int)(time_us/1000); } 2、延时毫秒级时间 void my_del…

【数据分析师求职面试指南】必备编程技能整理之Hive SQL必备用法

文章目录熟悉Python懂R语言掌握SQL大数据基础数据库常用类型多表查询更多聚合函数distinctcase when窗口函数动态更新一行变多行调优内容整理自《拿下offer 数据分析师求职面试指南》—徐粼著 第四章编程技能考查熟悉Python 懂R语言 掌握SQL 大数据基础 Hive时Hadoop的一个…

C++基础了解-10-C++ 判断

C 判断 一、C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。 下面是大多数编程语言中典型的判断结构的一般形式: …

电商 SaaS 全渠道实时数据中台最佳实践

摘要:本文整理自聚水潭数据专家张成玉,聚水潭高级数据工程师应圣楚,在 FFA 2022 行业案例专场的分享。本篇内容主要分为四个部分:实时数仓的建设和发展数据中台的产品体系及架构实时计算的实践和优化对实时计算的未来展望Tips&…

2019年MathorCup数学建模B题环形穿梭车系统的设计与调度解题全过程文档及程序

2019年第九届MathorCup高校数学建模挑战赛 B题 环形穿梭车系统的设计与调度 原题再现: 整体求解过程概述(摘要) 环形穿梭车系统为集多种高新技术于一体的自动搬运设备,行驶和输送速度快、灵活性好、自动化程度高。但由于系统采用封闭式轨道&#xff0c…

成为AI架构师的三大能力

AI架构师的定义 “AI 架构师”是以深度学习为代表的第三次AI热潮所催生的新型复合型人才,它的产生最本质的驱动因素是AI产业化落地应用的蓬勃发展对人才的需求,深度学习突出的工程属性也特别需要复合型人才来驾驭。 从字面来看,AI架构师的“…

Pytorch深度学习实战3-8:详解数据可视化组件TensorBoard安装与使用

目录1 什么是Tensorboard?2 Tensorboard安装3 Tensorboard可视化流程4 Tensorboard可视化实例4.1 常量可视化4.2 特征图可视化1 什么是Tensorboard? 在深度学习领域,网络内部如同黑箱,其中包含大量的连接参数,这给人工…

续航乱标销量低迷! 零跑汽车短时“掉”电快 ?

【锋巢网】 进入3月,行业复苏的景象映入眼帘,但是新能源车企却有人欢喜有人愁。 近日,各大新能源车企公布了自家2月份的销量数据,整体来看,部分新能源车企在2月份的交付量战绩显著,涨幅颇高。其中&#x…

class01:VUE简介与实例挂载

目录一、VUE简介1. 介绍2. 学习内容3. 引入Vue4. 全局配置5. Vue Devtools安装二、挂载Vue实例一、VUE简介 1. 介绍 Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不…

九、CSS3新特性三

文章目录一、逐帧动画二、flex弹性盒子三、少量元素侧轴对齐方式四、折行侧轴对齐方式五、项目属性六、网格布局七、网格布局的对齐方式八、网格布局的项目合并一、逐帧动画 一张背景图,改变back-position-x的位置让他动起来 step-start 逐帧动画 animation: play …

宝塔webhook自动化打包vue项目时,npm不生效问题

文章目录📋前言🎯查看webhook配置的代码🎯测试代码,检查输出内容🎯解决方法📋前言 这篇文章主要是记录和解决在宝塔面板中,webhook自动化打包vue项目时,npm不生效问题。说来奇怪&am…

【DBC专题】-10-CAN DBC转换C语言代码Demo_接收Rx报文篇

案例背景(共15页精讲): 该篇博文将告诉您,CAN DBC转换C语言代码Demo,只需传递对应CAN信号关联参数,无需每个信号"左移"和"右移",并举例介绍:在CANoe/Canalyzer中CAPL中的应用&#xff…

【MIT 6.S081】Lab1: Xv6 and Unix utilities

Util概述sleeppingpongprimesfindxargs本Lab包括五个应用程序的实现,初步熟悉系统调用接口。用时约8h(我太菜辣)本Lab包括五个简单程序的实现,初步熟悉系统调用接口。 笔者用时约6h(我太菜辣) 概述 根据文…

mysql数据库之全局锁

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#x…

【Day2】Numpy简单入门基础

NumPy 简单入门基础 我的另一篇文章 : Numpy介绍-深度学习:Numpy介绍-深度学习(Numpy介绍深度学习使用看这些足够了) import numpy as npmy_array np.array([1, 2, 3, 4, 5]) print(my_array)[1 2 3 4 5]print(my_array.shape)…

Kafka 多线程消费者

Kafka 多线程消费者多线程方案Kafka 0.10.1.0 后,Kafka Consumer 变为双线程的设计 : 用户主线程 : 启动 Consumer 的 main心跳线程 (Heartbeat Thread) : 定期对 Broker 发送心跳请求,探测消费者的存活性 (liveness)将心跳频率与主线程处理…

MQTT协议-取消订阅和取消订阅确认

MQTT协议-取消订阅和取消订阅确认 客户端向服务器取消订阅 取消订阅的前提是客户端已经通过CONNECT报文连接上服务器,并且订阅了一个主题 UNSUBSCRIBE—取消订阅 取消订阅的报文同样是由固定报头可变报头有效载荷组成 固定报头由两个字节组成,第一个…

2023年,当我们谈论架构时,我们要聊什么

架构是一个非常宽泛的话题,从组织结构上来说,涉及到前端、后端、运维;从软件设计上来说,涉及到需求分析、设计、编码、测试;从物理结构上来说,涉及到CDN、负载均衡、网关、服务器、数据库。当前一些架构方面…

奇淫技巧:阅读源码时基于一组快捷键,让我们知道身在何方!

一个十分蛋疼的问题 在我们阅读框架底层源码的时候,我们往往会一个方法一个方法的往下翻,翻了很久很快就会有这样的灵魂拷问:我从那个类(方法)来,我要到哪个(类)方法中去。这个时候…