C++学习之gcc编译四步

2023-11-07


gcc是一个开源的C语言编译器,它将C语言源代码编译成目标代码。gcc编译器通常分为四个步骤,即预处理、编译、汇编和链接。下面在本文中介绍在linux下gcc编译四步的过程。

一、linux下编写Hello World!代码文件

首先我们在代码目录使用vi hello.c命令创建并打开一个代码文件。

vi hello.c

执行后我们进入编辑界面,按i健开始编写代码,编写完成后按esc健输入:wq写入并退出,输入ls命令查看hello.c文件成功创建。
在这里插入图片描述
在这里插入图片描述

二、gcc编译四步

1.预处理(Preprocessing)

在预处理步骤中,预处理器处理C语言源代码,扫描程序中所有的#开头的预编译指令,并将它们替换成相应的文本。预编译指令可以包括头文件包含、条件编译等等。处理后的代码通常以.i为扩展名。可以使用以下命令进行预处理:

gcc -E hello.c -o hello.i

执行完预处理命令后ls查看成功生成hello.i文件,其中,hello.c为原始的C语言源文件,hello.i为预处理器处理后的代码。
在这里插入图片描述

2.编译(Compilation)

在编译步骤中,编译器将预处理器处理后的代码转换成汇编代码。它会对代码进行语法和语义分析,检查程序的语法错误和类型错误,并生成汇编代码。处理后的代码通常以.s为扩展名。可以使用以下命令进行编译:

gcc -S hello.i -o hello.s

执行完编译命令后ls查看成功生成hello.s文件,其中,hello.i为预处理器处理后的代码,hello.s为编译器生成的汇编代码。
在这里插入图片描述

3.汇编(Assembly)

在汇编步骤中,汇编器将汇编代码转换成机器码。它会将汇编代码转换为可执行代码,同时还会生成调试信息和符号表。处理后的代码通常以.o为扩展名。可以使用以下命令进行汇编:

gcc -c hello.s -o hello.o

执行完编译命令后ls查看成功生成hello.o文件,其中,hello.s为编译器生成的汇编代码,hello.o为汇编器生成的目标代码。
在这里插入图片描述

4.链接(Linking)

链接器将编译器生成的目标代码以及可能的库文件合并成最终的可执行文件。链接器将所有代码段和数据段链接起来,解析所有的符号引用,并生成可执行文件。处理后的文件通常以可执行文件的格式保存。可以使用以下命令进行链接:

gcc hello.o -o hello

执行完编译命令后ls查看成功生成hello可执行文件,其中,hello.o为汇编器生成的目标代码,hello为最终生成的可执行文件。
在这里插入图片描述

三、执行

gcc编译四步完成之后,我们可以通过使用./+可执行文件的名字来运行可执行文件,可以通过下面代码来执行:

./hello

在这里插入图片描述可以看到成功输出Hello,world!,到这里代码成功执行完毕。

四、gcc hello.c -o hello命令替代编译四步命令

通过上述编译四步过程我们感觉比较繁琐,gcc提供一条命令可以替代上述四条命令:

gcc source.c -o executable

其中,source1.c和source2.c是要编译的源文件,executable是最终生成的可执行文件的名称。我们通过rm命令把上面生成的文件删除:
在这里插入图片描述然后使用上面的命令直接生成hello可执行文件。
在这里插入图片描述
可以看到成功输出Hello,world!。

五、总结

使用一条命令编译程序的优点是能够简化编译过程,使编译更加快捷和方便,同时也可以自动处理多个源文件之间的依赖关系。相较于编译四步来说有以下有点:

简化编译过程

使用一条命令编译程序,可以将预处理、编译、汇编和链接这四个步骤合并为一个步骤,从而简化了编译过程。这不仅可以减少输入的命令数量,也可以减少出错的可能性,使编译更加高效。

自动处理依赖关系

使用一条命令编译程序,编译器可以自动处理多个源文件之间的依赖关系。这意味着,如果一个源文件依赖于另一个源文件,那么编译器会自动编译所有相关的源文件,并将它们链接到一起,生成可执行文件。这样就不需要手动处理多个源文件之间的依赖关系,从而节省了时间和精力。

方便快捷

使用一条命令编译程序,可以快速编译和测试代码,从而提高开发效率。此外,一条命令还可以包括多个参数,例如编译选项和库文件等,从而提供了更多的灵活性和功能。

需要注意的是,使用一条命令编译程序可能会带来一些缺点,例如可能会降低编译速度和灵活性等。此外,如果需要进行更高级的操作,例如添加编译选项或链接库文件等,还需要使用其他参数来进行设置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++学习之gcc编译四步 的相关文章

  • 格式说明符%02x

    我有一个简单的程序 include
  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • 条件类型定义

    如果我有一小段这样的代码 template
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • Fedora dnf 更新不起作用?

    当我尝试使用 update 命令更新 Fedora 22 时 sudo dnf update 我收到以下错误 错误 无法同步存储库 更新 的缓存 无法准备内部镜像列表 Curl 错误 6 无法解析主机名 无法解析主机 mirrors fed
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr

随机推荐

  • 《算法:第四版》课后练习 1.1 答案

    以下答案纯属个人愚见 作为IT新手 算法代码中难免有逻辑漏洞和其他不足之处 欢迎朋友你点评拍砖 交流争辩能极大开阔思维 愿一起加油进步 1 1 19 在计算机上运行以下程序 1 public class Fibonacci 2 3 publ
  • springboot集成RedisTemplate

    RedisTemplate使用 基本信息 Maven依赖 yml配置文件 redisConfig配置类 Redis操作string Redis操作list 基本信息 spring 封装了 RedisTemplate 对象来进行对redis的
  • c语言间接级别不同_间接寻址不同问题?求解决!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 错误18error C2040 FineStu Student int 与 int 的间接寻址级别不同e vs study study study c1441Study include incl
  • python 基本概念整理

    一 简介 1 基本概念 Python 是一个高层次的结合了解释性 编译性 互动性和面向对象的脚本语言 Python 的设计具有很强的可读性 相比其他语言经常使用英文关键字 其他语言的一些标点符号 它具有比其他语言更有特色语法结构 Pytho
  • post和get调用API接口的优势分享和实例

    post和get调用API接口 POST和GET都是HTTP协议中的方法 用于客户端向服务器发送请求并获取响应 在调用API接口时 一般使用GET或POST方法 GET方法是通过URL向服务器请求资源的一种方法 在URL中 请求参数会被编码
  • vue3.0之-watch全面解析

    1 监听ref 创建的基本数据类型 栗子1 监听多个数据
  • OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and

    OpenJDK 64 Bit Server VM warning Options Xverify none and noverify were deprecated in JDK 13 and will likely be removed
  • Anaconda下载与安装详解

    第一步 进入官网下载符合自己电脑版本的anaconda 官网地址 https www anaconda com products distribution 其它版本 下拉最后 如图所示 第二步 双击打开下载好的安装文件 如图所示 点击 Ne
  • KNN分类算法原理及其Matlab实现

    KNN算法原理 K近邻算法是一种简单的监督学习算法 对于给定测试样本 直接计算该样本和训练集的距离 将距离最近的k个 邻居 点的类别作为参考 作为预测结果返回 测试数据 测试数据来自林智仁的分类任务数据集 链接 https www csie
  • 想在Android应用程序中将XLS文件转换为PDF吗?看完这篇教程就懂了

    在各种情况下 您可能需要通过Internet共享Excel文件 为避免篡改 最佳做法是在共享之前将这些文件转换为PDF格式 因此 在本文中 将学习如何在Android应用程序中将Excel XLSX或XLS文件转换为PDF 另外 还将讨论E
  • Svelte 实现 keypress 快捷键功能

    有些框架中内置了常用的事件修饰符和按键修饰符 例如 Vue 中就提供了按键 enter 13 修饰键 ctrl alt shift meta等修饰符 简化了很多快捷键功能的实现 在 Svelte 中也提供了 preventDefault s
  • C++ stack容器

    C stack容器 1 stack容器的基本概念 2 stack容器的创建 stack 默认构造函数 创建一个空的 stack 对象 例如 下面一行代码使用默认的 deque 为底层容器 创建一个空的堆栈对象 s stack
  • 扫雷

    扫雷 扫雷游戏是晨晨和小璐特别喜欢的智力游戏 她俩最近沉迷其中无法自拔 该游戏的界面是一个矩阵 矩阵中有些格子中有一个地雷 其余格子中没有地雷 游戏中 格子可能处于己知和未知的状态 如果一个己知的格子中没有地雷 那么该 格子上会写有一个一位
  • 计算机网络---TCP/IP网络编程实验

    文章目录 计算机网络 TCP IP网络编程实验 一 实验目的 二 实验环境和任务 三 实验步骤及实验结果记录 四 实验结果分析和总结 计算机网络 TCP IP网络编程实验 一 实验目的 掌握TCP IP协议的基本知识 TCP IP协议的基本
  • 2023秋招,软件测试面试八股文(有答案版),金九银十季,涨薪涨薪

    最近呢有很多的小伙伴问我有没有什么软件测试的面试题 由于笔者之前一直在忙工作上的事情 没有时间整理面试题 刚好最近休息了一下 顺便整理了一些面试题 现在就把整理的面试题分享给大家 希望可以帮助到各位 废话就不多说了直接上干货 Tip 我整理
  • jQuery插件开发全解析,jQuery.extend , (function($){ , $.fn.pluginName

    序 匿名函数 匿名函数没有实际名字 也没有指针 怎么执行滴 其实大家可以看看小括号的意义就应该可以理解 小括号有返回值 也就是小括号内的函数或者表达式的返回值 所以说小括号内的function返回值等于小括号的返回值 不难理解 functi
  • Python for循环的使用

    一 for循环的使用场景 1 如果我们想要某件事情重复执行具体次数的时候可以使用for循环 2 for循环主要用来遍历 循环 序列 集合 字典 文件 甚至是自定义类或函数 二 for循环操作列表实例演示 使用for循环对列表进行遍历元素 修
  • 使用策略模式+工厂模式对接口进行分配处理。远离if else

    使用策略模式 工厂模式对接口进行分配处理 远离if else 背景 在项目中我们会遇到不同时间或者不同条件下 调用不同的方法或处理方式 因此我们可以采用策略模式进行满足不同的对象执行不同的具体行为 再用工厂模式进行匹配对应的对象 首先我们做
  • PID稳压

    思路说明 我们设置一个目标值 这是我们要调节的目标 我们通过AD采样 PC3 采集到当前电压 通过减法运算我们得出当前电压与目标电压的差值 接下来我们只要发现当前电压与目标电压不同 我们就要想办法改变当前单片机的输出电压 PA8 也就是当前
  • C++学习之gcc编译四步

    C 学习之gcc编译四步 一 linux下编写Hello World 代码文件 二 gcc编译四步 1 预处理 Preprocessing 2 编译 Compilation 3 汇编 Assembly 4 链接 Linking 三 执行 四