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

news2024/11/25 6:51:20

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【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.coloradmin.cn/o/721229.html

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

相关文章

ROS:节点运行管理launch文件

目录 一、launch文件1.1概念1.2作用1.3实例1.新建launch文件2.调用 launch 文件 二、<launch>三、node四、include五、remap六、param七、rosparam八、group九、arg 一、launch文件 1.1概念 aunch 文件是一个 XML 格式的文件&#xff0c;可以启动本地和远程的多个节点&…

Redis从入门到精通【进阶篇】之对象机制详解

文章目录 0. 前言1. 详解1.1 redisObject 对象设计目的1.2 redisObject数据结构1.2 Redis 是如何使用redisObject1.2.1. 对象创建1.2.2. 对象引用计数1.2.3. 对象共享1.2.4. 对象的编码方式1.2.4. 对象的值 2. 总结2.1. redisObject对象如何实现数据共享和对象池技术&#xff1…

vue项目打包并配置到iOS工程中

一、修改vue项目的配置文件 将config文件夹里面的index.js中的 assetsPublicPath的值修改为“./” Webpack.prod.conf.js 中output添加参数publicPath:./ 在webpack.base.conf.js里 publicPath: process.env.NODE_ENV 生产 &#xff1f;./ config.build.assetsPublicPath :…

Compose编排工具应用

补充&#xff1a; Docker Compose 文件&#xff1a;Docker Compose 是一个用于定义和运行多个 Docker 容器的工具。它使用 YAML 文件格式来描述应用程序的各个组件和其配置。以下是一个简单的示例&#xff1a; 在上面的示例中&#xff0c;我们定义了两个服务&#xff1a;web 和…

SpringBoot 之实现 PDF 添加水印的方案

简介 PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;是一种流行的文件格式&#xff0c;它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下&#xff0c;我们需要对 PDF 文件添加水印&#xff0c;以使其更具有辨识度或者保护其版…

ChatGLM2-6B的P-Tuning微调

ChatGLM2-6B&#xff1a;https://github.com/THUDM/ChatGLM2-6B 模型地址&#xff1a;https://huggingface.co/THUDM/chatglm2-6b 详细步骤同&#xff1a;ChatGLM-6B的P-Tuning微调详细步骤及结果验证 环境可复用ChatGLM-6B&#xff08;上述部署教程&#xff09;&#xff0c;…

简要介绍 | 知识蒸馏:轻量级模型的智慧之源

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对知识蒸馏进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 知识蒸馏&#xff1a;轻量级模型的智慧之源 A Gentle Introduction to Hint Learning & Knowledge Distillation | by LA Tran | …

Some about RMI

&#xff08;备份防止忘掉&#xff09; 一开始编译javac所有文件 这个问题概率遇到 解决方法&#xff1a; 然后java编译impl文件 直到出现bound in registry这一句 然后这个cmd不要关掉 重新在eclipse这个类的工作路径打开一个cmd 看到这个之后回到eclipse里面运行app这个文…

数据结构--树的性质

数据结构–树的性质 树的常考性质 常见考点 1 : 结点数 总度数 1 \color{red}常见考点1:结点数总度数1 常见考点1:结点数总度数1 结点的度 ―― 结点有几个孩子(分支) 树的度 ―― 各结点的度的最大值 m叉树 ―― 每个结点最多只能有m个孩子的树 常见考点 2 : 度为 m 的树、…

MySQL安装以及体系结构

1.简述mysql体系结构 MySQL 最重要、最与众不同的特性是它的存储引擎架构&#xff0c;这种架构的设计将查询处理 &#xff08;Query Processing&#xff09;及其他系统任务&#xff08;Server Task&#xff09;和数据的存储/提取相分离。这种 处理和存储分离的设计可以在使用时…

【简单认识LVS及LVS-NAT负载均衡群集的搭建】

文章目录 一、LVS群集简介1、群集的含义2、性能扩展方式3、群集的分类4、负载均衡群集架构1、负载均衡的结构 5、三种负载调度工作模式1、NAT模式2、TUN模式3、DR模式 二、LVS虚拟服务器1、Linux Virtual Server简介2、启用LVS虚拟服务3、LVS调度算法&#xff08;1&#xff09;…

YoloV5/YoloV7改进---注意力机制:高斯上下文变换器GCT,性能优于ECA、SE等注意力模块 | CVPR2021

目录 1.GCT介绍 实验结果 2.GCT引入到yolov5 2.1 加入common.py中&#xff1a; 2.2 加入yolo.py中&#xff1a; 2.3 yolov5s_GCT.yaml 2.4 yolov5s_GCT1.yaml 1.GCT介绍 论文&#xff1a;https://openaccess.thecvf.com/content/CVPR2021/papers/Ruan_Gaussian_Context_Tra…

Spring源码解析(二):bean容器的创建、默认后置处理器、扫描包路径bean

Spring源码系列文章 Spring源码解析(一)&#xff1a;环境搭建 Spring源码解析(二)&#xff1a; 目录 一、Spring源码基础组件1、bean定义接口体系2、bean工厂接口体系3、ApplicationContext上下文体系 二、AnnotationConfigApplicationContext注解容器1、创建bean工厂-beanFa…

计算机网络概述(三)

常见的计算机网络体系结构 OSI体系结构&#xff1a; 物理层→数据链路层→网络层→运输层→会话层→表示层→应用层 TCP/IP体系结构&#xff1a; 网络接口层→网际层→运输层→应用层 一般用户的设备都有TCP/IP协议用于连接因特网&#xff0c;TCP/IP的网络接口层并没有规定使用…

Linux基础+html和script一些基本语法

文章目录 linux 基础名字含义指令 html 语法style 样式属性样式标签属性颜色margin 边距ransform 旋转角度重复样式opacity 透明度div 方块元素box-shadow 阴影属性浮动 script获取节点onclick 点击触发setTimeout 定时器利用定时器实现 动画效果 javascript强弱语言区分parseI…

简单详细的MySQL数据库结构及yum和通用二进制安装mysql的方法

目录 mysql体系结构mysql的安装方法一&#xff0c;yum安装1&#xff0c;首先下载一个网络源仓库&#xff1a;2&#xff0c;然后安装 mysql-community-server3&#xff0c;启动mysqld 服务4&#xff0c;然后登录数据库5&#xff0c;初次登录要设置密码&#xff0c;而且不能太简单…

小型电子声光礼花器电子烟花爆竹电路设计

节日和庆典时燃放礼花&#xff0c;其绚丽缤纷的图案&#xff0c;热烈的爆炸声、欢乐的气氛&#xff0c;能给人们留下美好的印象&#xff0c;但有一定的烟尘污染和爆炸危险隐患。本电路可以模拟礼花燃放装置&#xff0c;达到声型兼备的效果&#xff0c;给人们在安全、环保的环境…

redis rehash

dict结构 dictEntry即键值对&#xff0c;每个桶就是dictEntry连接的链表 typedef struct dictEntry {void *key;union {void *val; // 自定义类型uint64_t u64;int64_t s64;double d;} v;struct dictEntry *next; } dictEntry;数据真正指向的地方 typedef struct dictht {di…

京东网站登录二维码显示不出来

环境&#xff1a; 360急速浏览器 Win10专业版 问题描述&#xff1a; 京东网站登录二维码显示不出来 解决方案&#xff1a; 1.打开安全卫士 2.功能大全找到断网急救箱 3.全面诊断一下有问题修复一下&#xff0c;重启浏览器解决

数字迷宫:探秘统计位数为偶数的奇妙世界

本篇博客会讲解力扣“1295. 统计位数为偶数的数字”的解题思路&#xff0c;这是题目链接。 统计位数是偶数的数据个数&#xff0c;关键在于如何统计一个整数的位数。方法是&#xff1a;对于一个整数n&#xff0c;每次/10&#xff0c;都会缩小一位&#xff0c;所以一直进行/10操…