目录

什么是gcc、g++

gcc、g++ 相关操作详解

预处理、编译、汇编、链接来源

动静态链接是什么

结语


什么是gcc、g++

gcc、g++其实就是编译器,是帮助我们从.c或者.cc,.cpp文件编译成可执行程序的

其中,我们如果要编译c语言文件的话,上面两个我们都可以使用,虽然g++是用来编译cpp的,但是cpp本身就包含了c语言

但是我们并不能使用gcc来编译cpp文件,会报错的,

接着我们来快速见一下gcc、g++的用法(其实这两个用法是差不多的,所以接下来主包就只展示gcc的用法):

这上面我们用到了一个 -o 的选项,这其实就是在给生成出来的可执行程序进行一个命名

如果我们不加上 -o 选项的话,那么他会默认将名字改成a.out

gcc、g++ 相关操作详解

这里要声明一下,由于gcc、g++底层用的是同样的东西,只不过默认处理的语言不同,仅此而已,所以我们gcc进行的操作,g++同样也有,也可以进行

所以,下面主包也同样是用gcc进行演示

首先,我们的程序要从.c文件变成可执行程序,一共需要经历四步:

预处理、编译、汇编、链接

对应在gcc中的操作是:

预处理:gcc -E test.c -o test.i

编译:gcc -S test.i -o test.s

汇编:gcc -c test.s -o test.o

链接:gcc test.o -o test

其实挺好记的,选项就是ESc,其实就看向键盘最左上角,有一个Esc退出键

而对应后缀就是iso,记着就好了

接着我们来详细谈一谈这四个步骤,以及为什么是四个步骤而不是一步到位

预处理

其实这个步骤就干几件事情:宏替换,去注释,头文件展开,条件编译等等

我们可以简单来看一看:

我们可以看到,左边是test.c,右边是.i,而我们左边就12行,到了右边就变成了800多行了,其实在预处理这一步,就是将上面的头文件展开,注释去掉等等而已

但还有一个,什么是条件编译?

其实就和名字一样,根据不同的条件,编译不同的代码:

就是这样的

编译

编译其实就干一件事情,将C语言转变成汇编代码

而我们上面预处理那一步,其实还是c语言,只不过变得非常干净而已

但是这一步,却是将c变成汇编,如下图:

我们用vim打开来看看这个.s文件

汇编

这一步传自上一步编译,这一步就是将汇编翻译成二进制

这里就不用vim打开来看了,因为二进制要看的话只会看到乱码

链接

到了最后一步链接这里,其实就是将.o文件(在Windows下可能叫做.obj)变成可执行程序

预处理、编译、汇编、链接来源

可能有人会疑惑,你说预处理我能理解,这样看起来还是比较整洁,替换一下我觉得没有问题

但是剩下三步是为什么?为什么不能一步到位直接形成可执行程序?

这里我们就需要讲一讲历史渊源了

在最开始的时候,电脑刚出来的时候,我们是用二进制进行编程的

就是像这样的

但是由于这样子太麻烦了,所以就出现了汇编语言

但是我们汇编的底层还是二进制

接着就是c语言的出现

我们当然可以直接从c变成可执行,但是这样太麻烦,因为最底层还是二进制,但是如果我们只是将出c变成汇编的话,汇编到二进制那一步我们就不需要做了,因为历史帮我们完成了,所以效率就很高

所以有四步一方面是历史原因,另一方面就是效率高了

另外还有一个有意思可以拓展一下的就是:编译器的自举

问一个问题,是有汇编语言,还是先有汇编语言的编译器?

答案当然是现有汇编语言,不然的话汇编对应的编译器的语法检查等等东西怎么写?

但是在最开始的时候,我们只有语言,没有对应的编译器,所以我们就会先用二进制写一个匹配汇编的编译器,接着就是,我们再用这个二进制写成的汇编编译器再写一个用汇编语言写出来的汇编编译器

这时,我们的编译器就出来了,c语言同样如此,这就叫做编译器的自举

动静态链接是什么

首先是操作,动态链接的话是默认的,你用gcc默认就是动态链接

如果你要静态链接的话,需要在gcc指令的最后面加上-static

但是可能会遇到如下这种情况:

这代表静态库没有安装,因为可能有些默认就是没有静态库的,用yum安装即可

然后要安装哪一个库就搜一下对应指令即可,因为一般用不到这个,所以其实不太需要安装

接着我们需要知道,我们的项目中会包含很多头文件,但是我们在编译的时候,会先通过预处理找到库然后将库展开代替到项目中的

这就说明,我们的云服务器中,系统中,是一定有对应的库的,这样我们才能说去找到他

而在Linux中,我们可以用 ldd 命令来查看

我们可以看到,这里面用到的就是c语言的标准库

同时我们还可以用file指令看看,具体的链接方式:

这里可以看到,就是动态链接

但是我们还需要知道,什么是动静态链接?

举个例子,学校外面有一个网吧,当到了周末的时候,同学们都会去到网吧里面用电脑,因为学校没有(假设),这时候,我们的网吧就是动态库,而同学们去网吧的这个过程,就叫做动态链接

而静态链接就是,没有网吧,但是在学生宿舍里面每一个人都有一台电脑,这时候不管外面有没有网吧,同学们都不会出去了,因为电脑直接就有了,这就是静态链接

而在我们的Linux中,最主要的就是动态链接,因为动态链接的优点就是,我们的库(网吧)只需要有一个就够了,会省空间,提高效率,但是缺点就是,当我们的这个对应的库被误删的时候,可能会有几百上千个文件(同学)同时用不了(上不了网)

而静态库的优缺点则是相对的,因为这是直接将库给每个人配一个了

这是动静态库大小的对比

我们可以看到的是,这里面都是用到的动态库,因为本身静态库的效率就不高,从这里我们就可以看到Linux对于动静态库的态度了

结语

这篇文章到这里就结束啦!!~( ̄▽ ̄)~*

如果觉得对你有帮助的,可以多多关注一下喔

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

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

相关文章

前端读取本地项目中 public/a.xlsx 文件中的数据 vue3

前端读取本地项目中 public/a.xlsx 文件中的数据 vue3 项目中需要在 Vue3 项目中读取 public/a.xlsx 文件,可以使用 fetch API 来获取文件内容 一、安装 xlsx 首先,你需要安装 xlsx 库: npm install xlsx二、在需要用的页面里引入xlsx im…

MySQL:to many connections连接数过多

当你遇到 MySQL: Too many connections 错误时,意味着当前连接数已达到 MySQL 配置的最大限制。这通常是由于并发连接过多或连接未正确关闭导致的。 一、查看当前连接数 查看 MySQL 当前允许的最大连接数 SHOW VARIABLES LIKE max_connections;查看当前使用的最大…

2024年热门AI趋势及回顾

人工智能的崛起 2024 年可能会被铭记为人工智能不再是一种技术新奇事物,而是成为现实的一年。微软、Salesforce 和 Intuit 等巨头将人工智能融入主流企业解决方案;从文案写作到数据分析,专门的人工智能应用程序和服务如雨后春笋般涌现&#…

LangFlow技术深度解析:可视化编排LangChain应用的新范式 -(2)流编辑器系统

Flow Editor System | langflow-ai/langflow | DeepWiki 流编辑器系统 相关源文件 流编辑器系统是 Langflow 的核心交互式组件,允许用户直观地创建、编辑和管理 LLM 驱动的应用程序。它提供了一个直观的画布,用户可以在其中添加节点、将其与边缘连接并…

驱动-定时-秒-字符设备

文章目录 目的相关资料参考实验驱动程序-timer_dev.c编译文件-Makefile测试程序-timer.c分析 加载驱动-运行测试程序总结 目的 通过定时器timer_list、字符设备、规避竞争关系-原子操作,综合运用 实现一个程序,加深之前知识的理解。 实现字符设备驱动框…

[Java实战]Spring Boot整合Kafka:高吞吐量消息系统实战(二十七)

[Java实战]Spring Boot整合Kafka:高吞吐量消息系统实战(二十七) 一、引言 Apache Kafka作为一款高吞吐量、低延迟的分布式消息队列系统,广泛应用于实时数据处理、日志收集和事件驱动架构。结合Spring Boot的自动化配置能力&…

Kotlin Multiplatform--04:经验总结(持续更新)

Kotlin Multiplatform--04:经验总结(持续更新) 引言 引言 本章用来记载笔者开发过程中的一些经验总结 一、Ktor设置Header 在官方文档中,想要设置Header的示例代码如下: client.get("https://ktor.io&qu…

在 Ubuntu 系统中,将 JAR 包安装为服务

在 Ubuntu 系统中,将 JAR 包安装为服务可以通过 systemd 来实现。以下是详细的操作步骤: 准备工作 确保 JAR 文件路径和 Java 运行时环境已准备好。验证 Java 是否可用: java -version创建 systemd 服务文件 systemd 的服务文件通常位于 …

电商项目-商品微服务-品牌管理微服务开发

一、功能分析 品牌管理微服务包括: (1)查询全部列表数据 (2)根据ID查询实体数据 (3)增加 (4)修改 (5)删除 (6)分页…

Spring Boot开发—— 整合Lucene构建轻量级毫秒级响应的全文检索引擎

文章目录 一、为什么选择 Lucene?轻量级搜索的底层密码二、核心原理:Lucene 的倒排索引2.1 倒排索引:速度之源2.2 段合并优化策略三、Spring Boot集成Lucene实战3.1 依赖配置3.2 实体与索引设计3.3 核心索引服务(含异常处理)3.4 使用示例(测试类)四、高级优化技巧4.1 索…

SpringBootDay1|面试题

目录 一、springboot框架 1、什么是springboot 2、Spring Boot的主要优点 3、springboot核心注解 4、定义banner(springboot的logo) 5、springboot配置文件 6、springboot 整合 jdbc 二、面试题 1)springmvc的作用 ​编辑 2&#x…

jQuery Ajax中dataType 和 content-type 参数的作用详解

jQuery Ajax中dataType与contentType参数解析 一、核心概念对比 参数作用对象数据类型默认值dataType响应数据预期接收的数据格式jQuery自动判断(根据响应头MIME类型)contentType请求数据发送数据的编码格式application/x-www-form-urlencoded 二、da…

几款常用的虚拟串口模拟器

几款常用的虚拟串口模拟器(Virtual Serial Port Emulator),适用于 Windows 系统,可用于开发和调试串口通信应用: 1. com0com (开源免费) 特点: 完全开源免费,无功能限制。 可创建多个虚拟串口…

LLM笔记(六)线性代数

公式速查表 1. 向量与矩阵:表示、转换与知识存储的基础 向量表示 (Vectors): 语义的载体 在LLM中,向量 x ∈ R d \mathbf{x}\in\mathbb{R}^d x∈Rd 是信息的基本单元,承载着丰富的语义信息: 词嵌入向量 (Word Embeddings)&am…

[特殊字符] Word2Vec:将词映射到高维空间,它到底能解决什么问题?

一、在 Word2Vec 之前,我们怎么处理语言? 在 Word2Vec 出现之前,自然语言处理更多是“工程方法”,例如字符串匹配、关键词提取、正则规则...。但这些表示通常缺乏语义,词与词之间看不出任何联系以及非常浅显。当然,技术没有好坏,只有适合的场景。例如: 关键词匹配非常…

栈和队列的模拟实现

栈和队列的模拟实现 容器适配器priority_queue(优先级队列)priority_queue的使用priority_queue的模拟实现: 仿函数什么叫仿函数?需要自己实现仿函数的情况: 栈的模拟实现队列的模拟实现deque(vector和list的缝合怪&am…

idea本地debug断点小技巧

idea本地debug断点小技巧 简单的设置断点条件 断点后,右键这个断点,可以在 condition 中填写能得出布尔的表达式 a 1 你如果写如下,表示先给他赋值,然后断住 a 2; true 断点后设置某个变量的值 在 debug 区域可以设置变量…

Oracle中如何解决FREE BUFFER WAITS

基于性能上的考虑,服务器进程在扫描LRU主列的同时,会将脏块移至LRU-W列,如果发现没有足够可用(可替换)的BUFFER CACHE,进程并不会无止尽地扫描整条LRU主列,而是在扫描到某个阀值(该阀…

Git命令使用全攻略:从创建分支到合并的完整流程

Git命令使用全攻略:从创建分支到合并的完整流程 引言一、初始化项目与基础配置1.1 克隆远程仓库1.2 查看当前分支状态 二、创建与管理分支2.1 从main分支创建新功能分支2.2 查看分支列表2.3 提交代码到新分支2.4 推送分支到GitHub 三、版本发布与标签管理3.1 创建轻…

MATLAB跳动的爱心

520,一个会动的心~~~ function particleHeart2 % author : slandarer% 所需匿名函数 col1Func(n) repmat([255,158,196]./255,[n,1])repmat([-39,-81,-56]./255,[n,1]).*rand([n,1]); col2Func(n) repmat([118,156,216]./255,[n,1])repmat([137,99,39].*.1./255,[n,…