【Linux从入门到精通|开发工具】---gcc/g++的基本使用

news/2024/4/29 15:53:17/文章来源:https://blog.csdn.net/m0_74352571/article/details/131343800

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【Linux专栏】🎈
本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌
在这里插入图片描述

接下来我们来学习Linux编辑器---gcc/g++的使用。
在学习gcc/g++之前,我们先来简单回顾一下之前学过的编译链接的内容。

1.预处理(去注释、头文件展开、条件编译、宏替换)
2.编译(生成汇编代码)
3.汇编(生成机器可识别代码)
4.链接(生成可执行文件或库文件)

目录

  • gcc使用过程(图文并茂)🍰
    • 预处理阶段
    • 编译阶段(生成汇编)
    • 汇编阶段(生成机器可识别代码)
    • 链接阶段(生成可执行文件或库文件)
  • gcc/g++常用命令选项🎂
    • -o
    • -E选项
    • -S选项
    • -c
  • 总结🥖

gcc使用过程(图文并茂)🍰

预处理阶段

首先这里这里源文件为mycode.c,请看:
在这里插入图片描述
然后输入指令gcc -E mycode.c -o mycode.i。编译通过之后就会形成mycode.i的一个文件。
这就是我们预处理之后的结果,如下图:

在这里插入图片描述
在这里插入图片描述
我们通过上图可以发现源文件mycode.c经过预处理之后由原来的十几行代码变成了800多行代码。为什么会这样呢?这都是从系统当中C语言的头文件中拷贝出来的。

通过上图我们也可以观察到我们原来注释的内容直接被裁剪掉了(去注释),同时发生了宏替换(因为编译器不需要处理已经被我们注释掉的东西)。这里的宏替换要注意,该处的宏替换只是进行了简单的宏替换,并不会做语法检查,因为在编译之前,这里就已经发生宏替换,即已经被替换掉了,并没有机会进行语法检查。
头文件全部拷贝到源文件当中,即当预处理之后其实就不需要头文件了。

综上,源文件经过预处理(其中包含着宏替换、去注释、条件编译、头文件展开)之后代码就会变的比较干净,然后编译器继续对这份干净的代码进行处理,即来到了下一步编译阶段。

编译阶段(生成汇编)

输入指令:gcc -S mycode.c -o mycode.s,即生成了一个mycode.s的文件,请看:

在这里插入图片描述
其中,mycode.s文件中就存放着mycode.c文件经过汇编之后生成的汇编代码,请看:
在这里插入图片描述

汇编阶段(生成机器可识别代码)

在汇编阶段,会把汇编代码转换为机器可识别的代码(即二进制文件)。
输入指令gcc -c mycode.s -o mycode.o
在这里插入图片描述
我们打开刚刚生成的mycode.o文件,里面存放的就是机器可识别代码(看起来像一堆乱码)。请看:
在这里插入图片描述
这里说明一下,vim工具是一个文本编辑器(既然是文本编辑器的话那就只能识别文本啦),而mycode.o中存放的是二进制文件,我们用文本编辑器来打开一个二进制文件的话再显示出来,我们看到的就会是一堆乱码。那我们应该如何查看这个二进制文件mycode.o呢?我们可以使用二进制查看工具od,即输入指令od mycode.o。请看:
在这里插入图片描述
到此为止,我们已经就来到了最后一个阶段,即链接阶段。

链接阶段(生成可执行文件或库文件)

输入指令gcc mycode.o -o mytest,请看:
在这里插入图片描述
这里的mytest就是一个可执行程序,我们来运行一个这个可执行程序。
在这里插入图片描述
好了,到此为止,就是一个源文件经过预处理、编译、汇编、链接再到最后运行程序的整个过程。
接下来,我们详细来介绍整个过程中用到的指令。

gcc/g++常用命令选项🎂

g++和gcc命令选项都是一个用法,所以这个只演示gcc的命令选项。

-o

将文件输出到目标文件。

注意,现在我们又回到了起点,即此时我们只有一个源文件mycode.c
在这里插入图片描述

gcc mycode.c
这里后面什么选项都不加,回车之后就会直接生成可执行程序a.out,请看:
在这里插入图片描述

gcc mycode -o XXX:让这个可执行程序自己来定义命名。其中-o意思就是后面跟我们想要自定义可执行程序的名称。
比如gcc mycode.c -o abc
在这里插入图片描述
其中,XXX就是着我们生成的可执行程序。运行结果如下:
在这里插入图片描述
其实我们也可以换一种写法,即gcc -o mytest mycode.c。(只要遵循一个原则即可:-o后面必须是可执行程序的名称)。
请看:
在这里插入图片描述

-E选项

gcc -E mycode.c -o mycode.i:对源文件进行预处理之后生成mycode.i文件。
这里有几个小细节需要我们注意-E后面永远跟着我们想要进行预处理操作的文件源,-o后面永远跟着最终要生成的目标文件。
如果我们这里的命令不加-o(即gcc -E mycode.c),这里会默认把输出结果打印到显示器上。这里我们就不进行演示了。
我们要把输出结果打印到文件里,其中-o后面生成的目标文件的文件名依然是可以随便取的,但是由于这里只对源文件mycode.c进行预处理操作,所以我们一般把生成的目标文件名取为mycode.i
下图是最终的演示结果:
在这里插入图片描述
head mycode.i
在这里插入图片描述
现在来解释-E是什么意思:
-E的意思就是告诉gcc编译器,从现在开始进行程序的翻译工作,将预处理工作做完之后就停下来不在继续往后走了。

-S选项

gcc -S mycode.i -o mycode.s:对预处理之后的mycode.i文件进行编译,同时生成mycode.s文件。
-o后面依然是跟着生成的目标文件,文件名依然是随便取,这里是完成的编译工作,所以这里建议生成的目标文件的后缀为.s,即mycode.s。同时这里要注意gcc -S mycode.i -o mycode.s是直接从刚刚生成的.i文件开始,继续进行程序的翻译工作,将编译工作做完之后停止工作。
其实我们这里可以换一种写法gcc -S mycode.c -o mycode.s。即告诉gcc编译器,从源文件.c开始进行程序的翻译工作,将编译工作做完之后停下来不在进行程序的翻译工作
现在我们来打开一下mycode.s文件,请看:
在这里插入图片描述

-c

gcc -c mycode.s -o mycode.o,其中-c的意思就是从现在卡hi是进行程序的翻译工作,将汇编工作做完之后,工作停止。
换一种写法的话请看:gcc -c mycode.c -o mycode.o,这里是从.c源文件开始进行工作直到将汇编工作完成。而 gcc -c mycode.s -o mycode.o是直接从编译阶段之后生成的.s文件之后开始工作,直到将汇编工作做完之后,工作停止。
所以这里的-c就是告诉gcc编译器,将程序的汇编工作做完就停止工作。
同时这里要注意:我们把生成的.o文件,即mycode.o文件称之为可重定位目标二进制文件。简称目标文件。其实就是window环境下的可执行文件(-obj)。
我们打开mycode.o文件打开之后发现是一堆乱码。请看:
在这里插入图片描述在这里插入图片描述
我们这里要特别注意,生成的mycode.o文件是不可以独立执行的,虽然已经是二进制文件了,需要经过链接才可以执行。
我们来验证一下mycode.o确实是不能执行的,请看:
在这里插入图片描述
我们如果赋予mycode.o文件可执行权限(chmod +x mycode.o)的话,请看:
在这里插入图片描述

可以看到依然是不可以执行的。
在Linux中,具有可执行权限和具有可执行的能力是两码事。
假设我给一个文本文件可执行的权限,最终这个文本文件依然是不可以执行的,因为这个文本文件本身就没有可执行的能力。
所以,这里的mycode.o文件(可重定位目标二进制文件)经过链接之后才可以运行。

最后进行链接:
gcc mycode.o -o mytest:将可重定位目标二进制文件和库进行链接形成可执行程序。
在这里插入图片描述
j

总结🥖

本文主要带大家回顾了一下内容:
1.C语言中编译链接的部分知识,总共分为4个阶段(预处理、编译、汇编、链接)。
2.同时演示了gcc/g++的几个常用的命令选项(-E -S -c -o)。

好了,本文就到这里啦!再见啦友友们!!!
在这里插入图片描述

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

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

相关文章

超实用攻略!GPT能玩的这么6,你居然还不知道?

开篇 自古以来,智者皆知学无止境,而在我们身边,正有一款奠基于这个原则的AI机器人—ChatGPT,他擅长从网络上学习各种知识,然后把这些知识用在他的对话中。没错,它就是天马行空的闲话家,无所不谈的取经者。可你知道怎样让它更加符合你的使用需求,适应你的工作节奏么?哦…

github中Mermaid的用法

这个东西是最近推出&#xff0c;首先是自己的repository中新建一个readme.md文件 需要一点前端的知识&#xff0c;就是先导入一个依赖文件&#xff0c;然后再写甘特图&#xff0c;如下&#xff1a; ### 甘特图 [<a href"https://mermaid-js.github.io/mermaid/#/gant…

前端设计必备的5款效率工具

前端设计工具以更低的成本提供更快的移动开发&#xff0c;他们帮助前端开发人员有效地创建响应设计&#xff0c;但找到一个实用的前端设计工具并不容易&#xff0c;在这里&#xff0c;为您整理了五个免费和易于使用的前端页面工具! 1.即时设计 即时设计是一款免费的在线 UI 设…

go-Nunu,一个好用的脚手架推荐,助你快速构建Go应用

虽然直接使用go-gin等框架也很简单&#xff0c;但是涉及数据库、jwt认证、配置文件和日志记录等全套的服务&#xff0c;一个个集成进来也挺费事。关键是一个个集成&#xff0c;很难做到结构清晰和分层合理。这里推荐一个好用的脚手架Nunu&#xff0c;太好用啦&#xff0c;可以让…

el-dialog 层级问题混乱

使用 element -UI 的弹窗时&#xff0c;一般来说弹窗的层级应该比较高&#xff0c;背景置灰。 下边这个弹窗是正常情况下的&#xff1a; 有时候出现这样的情况&#xff1a; 解决问题&#xff1a; 只需要 在标签里边添加 append-to-body 属性问题就解决了。

c#/c++ 通过系统api监视文件变化的问题

再分享个比较经典的案例&#xff0c;在很多场景下&#xff0c;我们都要去监视某个文件夹下的文件变化&#xff0c;在创建、修改或删除的时候触发一些行为。众所周知&#xff0c;c#有个实现类叫FileSystemWatcher&#xff0c;可以用来监视目录包括子目录下文件的变化&#xff0c…

Pygame中获取键盘按键的方法

1 事件与队列 在Pygame中&#xff0c;将用户对游戏的操作叫做“事件”。键盘按键是一种事件&#xff0c;鼠标点击和游戏手柄的输入也是一种事件。在Pygame的子模块locals中&#xff0c;对这些事件进行了定义。当用户通过键盘、鼠标或者游戏手柄对游戏进行操作后&#xff0c;产…

Stable Diffusion 模型界面介绍

Stable Diffusion 模型界面介绍 界面1 图1 Stable Diffusion 模型界面1 ①&#xff1a;选择的模型&#xff0c;及Stable Diffusion进行生成图片是使用的模型。其中.ckpt为大模型 ②&#xff1a;prompt --> 正向提示词。表示你的想法&#xff0c;你想要生成一副什么样的图…

IMX6ULL 移植篇-uboot 网络命令NFS

一. uboot 网络操作命令 本文介绍 nfs 命令的使用&#xff0c;具体是&#xff1a;通过 NFS服务向开发板下载 zImage内核镜像文件。 二. nfs 命令 nfs命令使用的目的&#xff1a;为了方便开发板调试。 nfs(Network File System) 网络文件系统&#xff0c;通过 nfs 可以在计算…

Redis【实战篇】---- 达人探店

Redis【实战篇】---- 达人探店 1. 达人探店 - 发布探店笔记2. 达人探店 - 查看探店笔记3. 达人探店 - 点赞功能4. 达人探店 - 点赞排行榜 1. 达人探店 - 发布探店笔记 发布探店笔记 探店笔记类似点评网站的评价&#xff0c;往往是图文结合。对应的表有两个&#xff1a; tb_bl…

记录力扣热题-100——从链表中找到刷题感觉

目录 一. &#x1f981; 前言二. &#x1f981; 解题过程1. 题目2. 思路一3. 思路二 三. &#x1f981; 文末活动内容简介本书结构关于代码 一. &#x1f981; 前言 狮子此前已经很久没有碰过算法题了&#xff0c;对于之前好不容易攒起来的题感又没了…最近准备面试&#xff0…

这些代码,差点把我气出内伤

先问大家一个小问题&#xff1a;你觉得看别人代码累&#xff0c;还是自己写代码累&#xff1f; 我相信有很多朋友会说&#xff0c;当然是自己写代码累了&#xff0c;要思考逻辑、要动手敲键盘&#xff0c;身心俱疲啊&#xff1b;但是&#xff0c;如果你需要经常阅读别人的代码…

leetcode 141.环形链表(快慢指针追击问题)

⭐️ 往期相关文章 &#x1f4ab;链接1&#xff1a;链表分割 &#x1f4ab;链接2&#xff1a;链表中倒数第k个结点(快慢指针问题) &#x1f4ab;链接3&#xff1a;leetcode 876.链表的中间结点(快慢指针问题) &#x1f4ab;链接4&#xff1a;leetcode 206.反转链表 &#x1f4…

vue echarts k线图 子功能设置

1 图中自定义选择区间, 手动鼠标拉取区间显示 2 底部数据选择条 dataZoom: [{type: inside,xAxisIndex: [0, 1],start: 98,end: 100},{show: true, // 这个是打开数据 选择条xAxisIndex: [0, 1],type: slider,top: 85%,start: 98,end: 100}], 3 鼠标在 k线图 选择区域 显示 的…

简历石沉大海!这份新鲜出炉的测试用人需求分析报告揭示了原因

最近有朋友吐槽简历投递后石沉大海&#xff0c;而主动打电话面试的除了外包还是外包。软件测试就业形势真的这么糟糕了&#xff1f; 小酋决定用数据揭开真相。因此小酋选取“软件测试”、“自动化测试”、“测试开发”作为搜索关键词&#xff0c;统计了 无忧网 近一个月用人市…

118.浏览器支持和修复Safari浏览器的Flexbox漏洞

在我们之前的文章中&#xff0c;我们介绍了测试的步骤 虽然现在大部分新版本的浏览器都能支持99%的CSS属性&#xff0c;但是不排除的是仍然有一些用户使用老的IE浏览器或者版本较低的浏览器去浏览我们的网页&#xff0c;这样我们的网站可能无法按照我们的预期工作&#xff1b…

[HNOI2008] 越狱

1.介绍 原题链接(回去补上,教练把锣鼓禁了qwq谴责这种行为&#xff01;&#xff01;&#xff01;) 一句话题意&#xff1a;房间1到房间n中&#xff0c;求存在相邻两个房间的宗教相同的可能性总和 就这&#xff1f;省选&#xff1f;哪个省的&#xff1f;湖南的&#xff1f;我…

学习小波分析的一些资料

Papers Wavelets and Subband Coding (2007) - M. Vetterli, J. Kovačević Tutorials A Really Friendly Guide to Wavelets (1999) - C. Valens [CiteSeerX][Mirror]A Practical Guide to Wavelet Analysis (1998) - C. Torrence , G. P. Compo [CiteSeerX]Basics of Wav…

hadoop --- MapReduce

MapReduce定义&#xff1a; MapReduce可以分解为Map (映射) Reduce (规约) &#xff0c; 具体过程&#xff1a; Map : 输入数据集被切分成多个小块&#xff0c;并分配给不同的计算节点进行处理Shuffle and Sort&#xff1a;洗牌和排序&#xff0c;在 Map 阶段结束后&#xf…

日本 NFT 项目概览与特点总结

日本的 NFT 市场 日本的 NFT 市场起源于与国内动漫和娱乐偶像的合作&#xff0c;重点关注本土文化&#xff0c;文化成为日本 NFT 项目的重要基石。 关键要点&#xff1a; 日本的 NFT 产业具有三个特点&#xff1a;广泛的知识产权&#xff08;IP&#xff09;、低 FUD 水平以及…