Linux 学习之路 -- 工具篇 -- gcc / g++

news2024/11/27 14:50:59

在 Linux 系统中,gccg++ 是两个常用的编译工具,分别用于编译 C 和 C++ 代码。下面我将介绍gcc、g++的一些基本用法

目录

一、简单的认识

二、简单了解一下编译的过程             

<1> 预处理阶段 

<2>编译

<3>汇编

<4>链接

三、分别介绍编译过程

<1>预处理                                                                 

<2>编译

<3>汇编

<4> 链接

<5>简单介绍一下动静态库


一、简单的认识

如果没有gcc / g++ ,用yum 安装一下即可。

下面先简单举个例子帮助理解

这里我先创建一个test.c文件(这里最好还是带后缀,不然gcc / g++是无法识别的)。

然后再退出vim , 通过gcc 命令编译该文件,形成一个新的可执行文件

这里系统会默认生成a.out的可执行文件,(如果想要修改可执行文件名,使用gcc -o 源文件 + 要生成的可执行文件名,这里gcc 后面的顺序是可以随意的,但是新的文件名要紧跟在 -o 后面)再用./a.out执行该命令。

(这里我忘记加换行符号,不好意思) ,如果我们用vim 打开这个可执行文件,会发现里面的东西我们看不懂,可执行文件是给cpu 执行的,而cpu 只认二进制的代码,所以我们的可执行文件就得是二进制的,我们的高级语言只是提高了编译的速度,并没有改变底层的原理。

另外一个需要注意的点就是,gcc 只能编译C语言的代码,g++可以编C语言跟C++的代码。             

二、简单了解一下编译的过程             

<1> 预处理阶段 

 1.头文件展开                                                                                                                                           头文件展开其实就是把 c / c++ 头文件中需要的部分拷贝到当前的文件当中。

2. 去注释

        顾名思义,就是去掉代码中的注释

3.宏替换

        将宏代码替换

4.条件编译

        把条件通过的代码进行编译

在预处理后,文件里的代码还是C或C语言

<2>编译

把C / C++ 转成汇编代码

<3>汇编

把汇编转成二进制文件,这个二进制文件又叫可重定位二进制文件,这个文件是不能被执行的

<4>链接

三、分别介绍编译过程

程序的翻译一次性就会把上述的所有动作完成,所以我们就要通过不同的选项进行编译,形成特定的文件。

<1>预处理                                                                 

这里我们可以使用-E选项编译文件,形成预处理完后的文件,(下面我选择的都是test.c 文件进行编译)

退出后,我们实行gcc -E test.c 命令,发现系统默认就会把预处理后文件内容全打印到屏幕上,这对于我们观察非常不方便,所以我们可以使用gcc -E test.c -o test.i 这里我们将test.c 预处理形成的文件打包形成一个test.i 的临时文件。一般来说,这里的临时文件一般就是把原文件名的后缀改成.i ,表示是预处理后形成的文件。

实行上述命令后,我们打开test.i 文件。我们可以发现文件多出来了很多的代码,这些代码其实就是stdio.h这个头文件里面的内容拷贝到test.i 这个文件里面,而这个过程就叫作头文件展开,包括一些注释也被去掉了,这里其实就是把去注释的过程。

这里我们再加入条件编译,看看预处理后的文件内容。

这里我们先写一段带条件编译的代码

然后我们退出去,用gcc -E a.cpp -o 1.cpp -D vscode2=2 (-D 其实就是定义一个宏,并且在编译器处理源代码之前处理,把这个宏插入进去)。打开1.cpp 这个临时文件,跳到最后几行

我们可以发现,只有条件编译通过的代码才被保留,其余的都被删除了,所以我们可以给编译器传不同的宏值,来对代码进行动态的裁剪。

<2>编译

编译过程其实就是把C语言代码转成汇编代码(其他语言也是差不多),我们可以用-S 选项,这个选项就是把从开始进行程序的翻译当编译工作做完,就停下来。这里我用test.i 这个文件来演示一下,我们可以用gcc -S test.i -o test.s  来形成一个test.s 的文件。

打开这里我们就可以看见,这里的代码全变成了汇编代码。

<3>汇编

就是把汇编的代码转成二进制文件,这里我们可以用-c 选项来实现该操作,这里我用 gcc -c test.s -o test.o 形成一个test.o文件(这里的o, 代表的是obj文件的缩写,也就是目标文件),这里我们运行一下命令,运行完后打开文件。

这里我们会发现,文件内容没法阅读,这是因为文件是二进制文件,但是vim是文本编辑器。所以会有这种情况的出现。正常来说文件内容已经是二进制,就应该能被执行,但是我们却执行不了(哪怕我们给它加上可执行权限)。

这是因为二进制文件里面有非常多的函数声明,我们必需要链接到库里面找到对应的函数,才能使文件变成可执行文件。

<4> 链接

我们先用gcc test.o -o  test 形成一个叫test的可执行文件,我们可以用ldd 文件来查看可执行文件所依赖的库。这里的库一般分为静态库和动态库,在不同的系统库文件后缀不同

Linuxwindows
动态库.so.dll
静态库.a.lib

这里我们用ldd 命令查看文件所依赖的库

这里我们依赖的库就是C标准库,这里我们的系统也是将C语言一些头文件和库下载好了,所以我们能就能再linux 中就能用C进行开发的原因 (安装环境其实也就是安装这些库跟头文件)。

用ls /lib64* 命令,查看当前系统下的相关库

<5>简单介绍一下动静态库

动静态库本质上也是文件,但是两者是有区别的(使用动态链接)

动态库就是被多个使用者共享使用,一旦缺失所有的用户都无法使用(使用静态链接)。

静态库就是把自己需要的文件拷到可执行文件中。

动态库静态库
优点比较节省资源,不会有很多的重复代码 -- 这里的资源包括磁盘资源,内存,网络等等不依赖库,同类型平台中可以直接运行使用
缺点对库的依赖性比较强,一但库丢失,所有使用这个库的文件都将无法运行可执行程序的体积较大,比较费资源

这里就不多介绍了,后面文件部分再详细介绍

以上就是全部内容,希望对各位读者有些许帮助。文中如有不当之处,还望各位大佬指正,谢谢!!!

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

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

相关文章

SQLite数据库成为内存中数据库(三)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite使用的临时文件&#xff08;二&#xff09; 下一篇&#xff1a;SQLite中的原子提交&#xff08;四) ​​ SQLite数据库通常存储在单个普通磁盘中文件。但是&#xff0c;在某些情况下&#xff0c;数据库可能…

python爬虫基础------函数

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

打工人神器! Raccoon 代码小浣熊

继这三个之后&#xff0c;今天又来了一个 [ Raccoon代码小浣熊 ] 核心精要与产品特点 全面支持多种编程语言和IDE&#xff1a;「代码小浣熊」支持超过90种主流编程语言&#xff0c;包括但不限于Python、Java、JavaScript、C、Go和SQL等。同时&#xff0c;它集成了市面上主流的…

电脑换屏总结——关于我把电脑砸了这件事!

大家好&#xff0c;我是工程师看海&#xff0c;很高兴和各位一起分享我的原创文章&#xff0c;喜欢和支持我的工程师&#xff0c;一定记得给我点赞、收藏、分享哟。 加微信[chunhou0820]与作者进群沟通交流。 【淘宝】https://m.tb.cn/h.5PAjLi7?tkvmMLW43KO7q CZ3457 「运放秘…

【ENSP】交换机和交换机之间实现静态路由

1.概念 三层交换机只能在Vlanif逻辑口配置iP地址 2.实现方法 交换机允许对应vlan通行&#xff0c;配置vlanif的ip地址&#xff0c;做静态路由 3.静态路由配置方法 ip route-static 目的网段 子网掩码 下一跳设备 LSW1三层交换机配置 u t m sys vlan batch 10 20 …

一文彻底搞懂并发容器

文章目录 1. 什么是并发容器2. 并发容器的分类 1. 什么是并发容器 并发容器是一种用于多线程环境的数据结构&#xff0c;它们能够有效地处理并发访问和修改的问题。在多线程应用程序中&#xff0c;多个线程可能会同时访问和修改共享的数据结构&#xff0c;这可能会导致数据不一…

npm卸载不掉的解决方案

不管怎么重装重启都报错 真服了&#xff0c;npm卸载不掉绝对是有缓存存在&#xff0c;用where npm查到d盘 实际上根本不在这个地方&#xff0c;这个是我安装的6.14.12版本的npm的地方&#xff0c;我说我怎么怎么重装怎么导包都不行呢&#xff0c;偷偷隐藏在这个目录里面&#…

vue3路由代码示例

路由简单分三步吧 第一定义路由&#xff1a; 包括访问地址&#xff0c;对应组件 第二使用&#xff1a;在index.html中使用它 下面是代码示例&#xff1a; components/Person.vue <template><router-link to"/test/hello">跳转</router-link>&…

简易TCP服务器通信、IO多路复用(select、poll、epoll)以及reactor模式。

网络编程学习 简单TCP服务器通信TCP三次握手和四次挥手三次握手&#xff08;如下图&#xff09;常见问题&#xff1f; 四次挥手 client和server通信写法server端client端 通信双方建立连接到断开连接的状态转换怎么应对多用户连接&#xff1f;缺点 IO多路复用select优缺点 poll…

Linux---命令行参数

一、命令行参数 在介绍命令行参数前&#xff0c;我想问大家一个问题&#xff0c;在以前写C/C时&#xff0c;main 函数可不可以带参数&#xff1f; 答案是可以带的&#xff0c;int main(int argc, char* argv[]){}&#xff0c;但平时写代码时也证明了&#xff0c;main 函数的参…

Gradle连接超时问题connect time out

出现这样的问题不要慌张&#xff0c;可能是你配置gradle的问题一步一步来解决就完事了 1. 出现这样的问题首先我们先检查配置 首先我们先看到的标出来的地址可以看到&#xff0c;我们需要下载的是这个链接里面的压缩包数据&#xff0c;查看版本以及这个链接是不是错误的 2. 第…

[OpenCV学习笔记]Qt+OpenCV实现图像灰度反转、对数变换和伽马变换

目录 1、介绍1.1 灰度反转1.2 图像对数变换1.3 图像伽马变换 2、效果图3、代码实现4、源码展示 1、介绍 1.1 灰度反转 灰度反转是一种线性变换&#xff0c;是将某个范围的灰度值映射到另一个范围内&#xff0c;一般是通过灰度的对调&#xff0c;突出想要查看的灰度区间。 S …

大创项目推荐 深度学习 opencv python 实现中国交通标志识别_1

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…

Windows下载使用nc(netcat)命令

‘nc’ 不是内部或外部命令&#xff0c;也不是可运行的程序&#xff1f; 点击链接地址&#xff0c;下载压缩包。 完成后解压 使用方式&#xff08;三种&#xff09;&#xff1a; 1、直接双击exe使用 2、把这个exe放到cmd启动的默认路径下 放到默认路径下&#xff0c;使用nc&a…

【Deep Learning 11】Graph Neural Network

&#x1f31e;欢迎来到图神经网络的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年3月20日…

openLooKeng开发环境搭建

文章目录 搭建OpenLooKeng开发环境要求 以下是搭建OpenLooKeng开发环境的基本步骤&#xff1a;1、从OpenLooKeng的GitHub仓库克隆代码&#xff1a;2、 构建OpenLooKeng生成IntelliJ IDEA项目文件 airbase构建项目过程中出现的问题checkstyle错误版本冲突问题hetu-heuristic-ind…

辽宁政府采购网怎么入驻?

辽宁政府采购网的入驻流程包括以下几个主要步骤&#xff1a; 注册账号&#xff1a;在辽宁政府采购网上商城注册账号。CA证书领取&#xff1a;注册成功后&#xff0c;需要领取CA证书以登录网上商城。搭建自营商城&#xff1a;因为后期需要和辽宁政府采购网上商城进行入驻&#…

执行 kubeadm join 报错ERROR FileAvailable--etc-kubernetes-kubelet.conf

执行 kubeadm join 报错ERROR FileAvailable–etc-kubernetes-kubelet.conf [rootk8snode2 ~]# kubeadm join apiserver.demo:6443 --token c4nezq.ecv2kg9ok6gsresw --discovery-token-ca-cert-hash sha256:be1a55bea6b5bb5c8810434d3905a9cd0bbc33181862f7ad601346e1ab0…

.NET CORE 分布式事务(二) DTM实现TCC

目录 引言&#xff1a; 1. TCC事务模式 2. TCC组成 3. TCC执行流程 3.1 TCC正常执行流程 3.2 TCC失败回滚 4. Confirm/Cancel操作异常 5. TCC 设计原则 5.1 TCC如何做到更好的一致性 5.2 为什么只适合短事务 6. 嵌套的TCC 7. .NET CORE结合DTM实现TCC分布式事务 …

wireshark创建显示过滤器实验简述

伯克利包过滤是一种在计算机网络中进行数据包过滤的技术&#xff0c;通过在内核中插入过滤器程序来实现对网络流量的控制和分析。 在数据包细节面板中创建显示过滤器&#xff0c;显示过滤器可以在wireshark捕获数据之后使用。 实验拓扑图&#xff1a; 实验基础配置&#xff1…