【Linux】gcc和g++

👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++和Linux还有算法
✈️专栏:Linux
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵,希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍
目录
- 前言
- 一、 Linux下编译C/C++代码
- 二、gcc/g++是如何完成代码编译
- 2.1 预处理
- 2.2 编译
- 2.3 汇编
- 2.4 链接
- 三、库
- 3.1 函数库的概念
- 3.2 动态库
- 3.3 静态库
- 3.4 小结
前言
大家的云服务器可能没有gcc或者g++指令,如果没有可以分别执行以下指令
-
sudo yum install -y gcc-gcc指令安装 -
sudo yum install -y gcc-c++g++指令安装
注意:如果sudo指令有问题的,建议先看看这篇博客 -> 点击跳转
一、 Linux下编译C/C++代码
gcc [.c文件]
执行完gcc [.c文件] 后,默认会生成可执行文件 a.out (前提是代码没有语法错误)

当然也有人想要为这个可执行文件起个名字,那么就要通过 -o选项 来实现
gcc [.c文件] -o [新名字]

注意:g++ 也可以通过 -o 选项生成指定文件。其指令基本都是一样的

二、gcc/g++是如何完成代码编译
由于gcc和g++只有编译文件类型不同,其他大差不差,因此以下就以gcc为例
2.1 预处理
预处理会进行以下操作:
- 去注释
- 头文件展开
- 条件编译
- 宏替换
我们可以直接通过gcc中的-E选项,来查看预处理的现象。注意:预处理后的文件后缀为.i,此时仍然是C语言代码。目的是生成一个干净的C代码程序
gcc -E [.c文件] -o [.i文件]

接下来我们可以打开预处理阶段的文件test.i来看看里面的代码

大家有没有想过这样一个问题:头文件展开就是将头文件的内容给拷贝过来,那我们怎么知道头文件在哪?
- 其实标准C库头文件(如
stdio.h、stdlib.h等)通常位于/usr/include目录下。

- 当然了,标准
C++库头文件(如iostream、vector等)通常位于/usr/include/c++目录下,该目录下还会有不同版本的子目录,对应不同的C++标准和编译器版本。

2.2 编译
- 编译阶段会进行:语法分析、词法分析、语义分析、符号汇总等,然后将合法的代码转为汇编代码。
编译阶段比较重要的一步就是符号汇总,它会各种符号汇总起来,形成符号表,符号表用于各种函数间的相互调用
我们可以直接通过gcc中的-S选项,来查看编译阶段的现象。注意:编译阶段的文件后缀为.s,此时 .s文件里是源文件的汇编代码。
gcc -S [.c文件] -o [重命名为.s文件]
// 注意[.c文件]也可以替换成[.i]文件

接下来,我们可以打开test.s查看汇编

2.3 汇编
- 主要任务是将汇编代码转为二进制(转为计算机懂的语言),并生成符号表
【补充】 什么是符号表
这个东西相当于函数独一无二的地址
C语言的符号是 _函数名
C++更详细一些,通常为 _Z函数名长度+函数名+ 形参类型的首字母
我们可以直接通过gcc中的-o选项,来查看汇编阶段的现象。注意:汇编文件后缀为.o,此时 .o文件将源文件转化为二进制文件。
gcc -c [.c文件] -o [重命名为.o文件]// 或者可以从[.s文件]开始编译
gcc -c [.s文件] -o [重命名为.o文件]

我们可以打开test.o来【欣赏】二进制文件

我们发现是一堆乱码,这是一个正常的现象,因为test.o本身是二进制文件,其,而vim是文本编辑器,自然而然就看不懂
但是我们可以使用工具 readelf:是一个用于查看和分析二进制可执行文件格式elf的工具。
readelf -a [二进制文件]
【以下只截取了一部分】

注意:二进制文件不可执行,需要通过链接才能执行。

2.4 链接
- 将可重定位目标的二进制文件(或称目标文件
.o),和库进行链接形成可执行文件。
// 两种写法
gcc [.c文件] -o [重命名可执行文件]
gcc [.o文件] -o [重命名可执行文件]


上面说了,目标文件需要和库进行链接,因此接下来我们来谈谈库。
三、库
3.1 函数库的概念
C程序中,并没有定义printf函数(我们只是调用函数),且在预编译中包含的stdio.h中也只有该函数的声明,而没有定义函数的实现。那么,是在哪里实现printf函数的呢?
在Linux系统中,它把C语言函数实现都被放到名为libc.so的库文件中去了(路径:/usr/lib64/libc.so)。

没有特别指定时,gcc会到系统默认的搜索路径/usr/lib下进行查找,也就是链接到libc.so库函数中去。
如上图所示,在Linux中,C语言函数库是一个文件,以.so为后缀的称为动态库;以.a为后缀的称为静态库。
另外,库是有自己的命名规则的。以lib为前缀,name为中缀,.so.版本为后缀。而库真正的名字只有中缀那一块,这也就为什么libc.so称为C语言函数库的原因了。
注意:我们现在的机器上,默认只会安装动态库,静态库是默认没有安装的

【总结】
-
函数的实现就是在库当中的
-
库其实就是把源文件(
.c文件),经过一定的翻译,然后打包,只给你提供一个文件(库文件)即可,不用给你提供给太多的源文件,也可以达到隐藏源文件的目的 -
头文件提供方法的声明, 库文件提供方法的实现 + 我们自己的代码 == 可执行程序
-
因此。库的作用:不用做很多重复的工作。
3.2 动态库
动态库即通过动态链接的库,动态库又称共享库,因为动态库中的内容是被所有程序共享的,简言之动态库中的代码只需要存在一份,程序需要使用时,直接通过对应位置调用就行了
在Linux中默认使用 动态链接 的方式,我们可以通过 指令ldd来查看文件的链接情况

我们还可以通过 file命令查看文件详细信息

3.3 静态库
静态库采用静态链接的方式;静态链接不同与动态链接共享的方式,如果程序调用静态库 ,会将自己所需要的代码拷贝至程序中 ,完成拷贝后,后续不需要再调用静态库。
如果想采用静态链接链接的方式编译程序,需要在编译时加上-static选项
gcc [源文件] -o [自己取] -static
而我们开头说了,我们的云服务器默认是没有静态库的,没有的可以通过sudo yum install -y glibc-static下载。还有我们也可以装一下c++的静态库sudo yum install -y libstdc++-static

当然,我们也可以通过ldd和file指令查看链接情况

由于静态链接是直接将需要的代码拷贝到程序中,因此最终生成的文件会变大,比较占空间

3.4 小结
【动态库】
-
优点
- 动态库因为是共享库,有效的节省资源(节省磁盘空间,内存空间,网络空间等)
-
缺点
- 动态库一旦缺失,导致各个程序都无法运行
静态库
- 优点
- 程序运行无需依赖库,可以独立运行
- 缺点
- 体积大,比较消耗资源,浪费空间
相关文章:
【Linux】gcc和g++
👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和Linux还有算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 …...
nginx国密ssl测试
文章目录 文件准备编译部署nginx申请国密数字证书配置证书并测试 文件准备 下载文件并上传到服务器,这里使用centos 7.8 本文涉及的程序文件已打包可以直接下载。 点击下载 下载国密版openssl https://www.gmssl.cn/gmssl/index.jsp 下载稳定版nginx http://n…...
H5 清除浮动
1、为什么要清除浮动? 为了解决块级元素浮动后父元素塌陷问题。 2、为什么会产生 父元素塌陷? 首先父元素没有设置高度,父元素的高度是由子元素中最高的控件决定,撑开 简单可以这样理解,原本是在和父元素在同一层级上…...
h5小游戏--2048
2048 经典2048小游戏,基于JS、Html5改写版 效果预览 点我下载源代码 下载代码解压后,双击index.html即可开始本游戏。 Game Rule 游戏规则 以下为游戏默认规则,若需要修改规则请修改代码。 移动箭头键来移动方块,当两个相同数…...
随手写了个博客多平台发布脚本:Python自动发布文章到Wordpress
引言 作为一名技术博主,提高博客发布效率是我们始终追求的目标。在这篇文章中,我将分享一个基于Python的脚本,能够实现博客多平台发布,具体来说,是自动发布文章到WordPress。通过这个简单而高效的脚本,…...
通义灵码,你的智能编码助手,免费公测啦!
目录 编辑 1、介绍 2、安装 3、功能介绍 行/函数级实时续写 自然语言生成代码 单元测试生成 代码注释生成 代码解释 研发智能问答 多编程语言、多编辑器全方位支持 4、视频 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家…...
QT Day01 qt概述,创建项目,窗口属性,按钮,信号与槽
1.qt概述 1.什么是qt Qt 是一个跨平台的 C 图形用户界面应用程序框架。它为应用程序开发者提供建立艺 术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组 件编程。 2.支持的平台 Windows – XP 、 Vista 、 Win7 、 Win8…...
Kafka(一)在WSL单机搭建Kafka伪集群
目录 1 运行Kafka单实例1.1 Windws1.1.1 安装包下载1.1.2 修改环境变量1.1.3 修改配置文件1.1.4 启动Kafka单机版 1.2 Linux1.2.1 安装包下载1.2.2 创建目录1.2.3 添加环境变量1.2.4 修改配置文件1.2.5 运行Kafka1.2.6 停止Kafka 2 搭建Kafka集群2.1 搭建Zookeeper集群2.2 搭建…...
centos7 keepalived 探测哪个是当前节点
前提 nginx 默认页面内容中需要加上各节点的ip nginx web页面修改 nginx配置文件路径:/etc/nginx/nginx.conf,该配置文件引用了/etc/nginx/conf.d/default.conf 打开/etc/nginx/conf.d/default.conf配置文件可以看到html页面的路径 /usr/share/nginx…...
【iOS】数据持久化(二)之归档和解档(iOS 13以后)
在之前介绍的数据存储方法中,不管是NSUserDefaults还是plist文件都不能对自定义对象进行存储,OC提供的解归档恰好解决了这个问题 本片文章对 iOS13 以后的版本 归档和解档 进行介绍。老版本的解归档见这篇文章:【iOS】文件(对象数…...
OpenHarmony模块化编译
一、环境配置 OpenHarmony版本:OpenHarmony 4.0 Release 编译环境:WSL2 Ubuntu 18.04 平台设备:RK3568 二、配置hb OpenHarmony 代码构建有build.sh和hb两种方式: #方式一、build.sh ./build.sh --product-name rk3568 --ccache#方式二、…...
Java游戏制作——王者荣耀
一.准备工作 首先创建一个新的Java项目命名为“王者荣耀”,并在src下创建两个包分别命名为“com.sxt"、”com.stx.beast",在相应的包中创建所需的类。 创建一个名为“img”的文件夹来储存所需的图片素材。 二.代码呈现 package com.sxt;import javax.sw…...
C# List<T>的综合用法
1、测试数据 //测试数据string str "";List<byte[]> bytes new List<byte[]>();for(int i0;i<10;i){byte[] bnew byte[2];b[0] (byte)(2 * i);b[1] (byte)(2 * i1);bytes.Add(b);str b[0] " " b[1] " ";}Console.WriteL…...
蓝桥杯-01简介
文章目录 蓝桥杯简介参考资源蓝桥杯官网第15届大赛章程一、概况(一)大赛背景和宗旨(二)大赛特色(三)大赛项目1.Java软件开发2.C/C程序设计3.Python程序设计4.Web应用开发5.软件测试6.网络安全7.嵌入式设计与…...
Spring的依赖注入,依赖注入的基本原则,依赖注入的优势
文章目录 Spring的依赖注入依赖注入的基本原则依赖注入有什么优势查找定位操作与应用代码完全无关。有哪些不同类型的依赖注入实现方式?构造器依赖注入和 Setter方法注入的区别 Spring的依赖注入 控制反转IoC是一个很大的概念,可以用不同的方式来实现。…...
Git远程仓库常用开发命令和理解
远程仓库 创建与合并分支 每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。 HEAD严格来说不是指向提交,而…...
Unknown error 1054
MySQL错误1054是“Unknown column”的错误,意味着在查询或语句中引用了一个不存在的列名。这通常是因为在查询中指定了一个不存在的列名。 解决步骤: 检查列名的拼写:确保在查询或语句中正确地输入了列名。检查大小写,确保与数据…...
pandas教程:Interfacing Between pandas and Model Code pandas与建模代码间的交互
文章目录 Chapter13 Introduction to Modeling Libraries in Python(Python中建模库的介绍)13.1 Interfacing Between pandas and Model Code(pandas与建模代码间的交互) Chapter13 Introduction to Modeling Libraries in Python…...
鸿蒙应用开发-初见:ArkTS
作者:HarderCoder ArkTS ArkTS围绕应用开发在 TypeScript (简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 基本语法 …...
HTTP 和 HTTPS 之间除了安全性区别外,还有哪些区别
HTTP 和 HTTPS 是两种常见的网络协议,它们都是用于在浏览器和服务器之间传输数据的。但是,它们之间也有一些重要的区别,这些区别涉及到数据的安全性、传输性能、使用成本和搜索排名等方面。本文将从以下几个方面来介绍 HTTP 和 HTTPS 的区别&…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
