一、gcc\g++编译器

什么是gcc和g++,它们的区别又是什么?
gcc编译器是专门用来编译C语言的,而g++编译器既可以编译C语言又可以用来编译C++,但是主要还是用来编译C++。
我们都知道代码形成可执行程序都是需要经过预处理、编译、汇编和链接这四个过程的,既然如此上述我们看到的两个编译器也必然是要围绕着这四个过程来进行说明。

1、预处理

预处理是做是什么工作的?

头文件展开、宏替换、去掉注释和条件编译

我们在linux中输入什么指令可以看见预处理这个阶段呢?

filename.c为要编辑的文件名
gcc -E filename.c 将预处理后的内容打印到显示屏上
gcc -E filename.c -o test.c 将预处理后的内容写到test.c文件里

什么是头文件展开呢?

头文件展开其实就是把头文件中相关的内容拷贝到源文件中,也就是说当预处理完成后我们其实就可以不用头文件了

什么是裁剪?我们又怎么理解裁剪呢?

裁剪其实就是对代码进行增、删和改操作。在预处理阶段,我们会发现代码从原来的几行一下子变成了几百行,这其实就是将头文件里面的内容拷贝到了源文件中了这里就是增,之后去掉注释这里就是删,最后根据条件可以修改代码这就是改。

2、编译

实现编译的操作

gcc -S filename.c -o test.c 对预处理阶段的文件进行编译

在这里插入图片描述
我们可以看到当我们输入上述指令后,会形成一堆我们看不懂的东西,而这个东西是什么呢?其实就是汇编语言

3、汇编

实现汇编操作

gcc -c filename.c -o test.c 对test.c进行汇编

经过上面的编译生成的汇编,而这里的汇编是生成可执行程序当中的一个阶段。它其实就是将汇编语言翻译成可重定位目标二进制文件。这里我们就有疑问了,既然它是翻译成二进制文件,是不是到这里我们计算机就可以识别了呢?并不是我们可以尝试使用./test.c来运行这个程序
在这里插入图片描述
我们发现直接就是报错了,这是为什么呢?我们接着往下看。

4、链接

实现链接的操作

gcc filename.c -o test.c

上面的汇编形成的可重定位二进制文件并不是一个可执行程序,它必须要经过链接才能生成可执行程序。这又是为什么呢?

比如在编程时,我们经常使用现成的库函数,而不必每次都重新编写所有功能代码,只需声明即可调用。同样,汇编生成的可重定位二进制文件也需要与库函数链接,才能最终生成可执行程序文件。

那么什么是链接呢?

在代码编译阶段,库函数的实际地址尚未确定,因为这些函数的具体实现位于库文件中。当进行链接时,链接器会将目标文件(.o)与库文件合并,在此过程中会解析并填充库函数在目标文件中的调用地址,最终生成完整的可执行文件。

为什么要有库?

使用库的主要目的是提升开发效率。在日常开发中,我们经常需要重复使用某些功能函数。如果每个开发者都自行编写这些基础功能,会造成大量重复劳动和时间浪费。

如何理解库呢?

库的常见分类有两种:静态库和动态库
在windows中后缀分别是:.lib 和 .dll
在linux中后缀分别是:.a 和 .so

动态链接:与动态库链接

在这里插入图片描述
静态链接:与静态库链接
在这里插入图片描述

注意:
静态链接有可能会失败,原因是因为系统中可能没有默认安装C\C++的静态库。编译器默认采用动态链接的方式,形成可执行程序。

什么是动态链接?

动态链接就是程序还未加载到内存的时候,就已经和动态库建立了信息上的链接,执行到库函数的时候,跳转到动态库执行,然后继续执行自己的代码

优点:节省资源
缺点:一旦丢失所有的程序都将无法运行

什么是静态库?

一组编译好的代码和数据的集合,它们在编译期间被链接到应用程序中

优点:不依赖任何库,自己独立就能运行
缺点:体积大,占据资源多,加载速度受影响

二、自动化构建make\Makedife

1、基本概念

make是一个linux系统内置的命令
Makefile是一个需要自己创建的文件
make命令会在当前目录下寻找makefile文件,解析里面的内容

2、操作步骤

(1)创建makefile文件

在这里插入图片描述

(2)编写makefile文件

在这里插入图片描述

在这里插入图片描述

(3)make指令运行代码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、makefile

在这里插入图片描述
这里我们会有很多的疑问。
为什么make的时候只执行了第一个目标呢?

这是因为make,makefile默认只形成一个目标,就是从上往下遇到的第一个目标

什么是伪目标?

.PHONY:表示被修饰的目标是一个伪目标
特点:伪目标总是被执行的。

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

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

相关文章

重复文件查找工具:DataSecurity Plus 全面提升企业文件管理效率

企业日常运营经常会出现这样的场景:员工在文件传输、共享与备份过程中,因操作不当或系统设置问题,出现文件重复存储;跨部门协作时,相同的项目资料可能被多次保存;随着数据迁移与系统升级,重复文…

【软件架构】资源池架构设计中的三种主流模式

在资源池架构设计中,三种主流模式——集中式、分布式和混合式资源池——各有其独特的优势、劣势和适用场景。理解它们的区别对于设计高效、可靠和可扩展的系统至关重要。 下面是对这三种模式的详细分析和比较:集中式资源池 核心概念: 将所有计…

Java 类加载冲突

在某次线上部署过程中,我们遇到了一个十分诡异的问题:同样的应用,在 ext3 文件系统下运行正常,但部署到 ext4 文件系统下却出现了如下异常:The methods class, com.ctc.wstx.io.StreamBootstrapper, is available from…

VMware安装 统信UOS桌面专业版

前言 近年来,随着Linux发行版在开发者、企业环境中的应用逐渐增多,国产操作系统统信UOS(基于Debian)因其良好的图形化界面和本地化支持,成为不少用户体验Linux生态的选择之一。本文将以VMware Workstation Pro 17为例…

SAP Datasphere 02 - 建模

创建连接创建到 HANA Cloud 实例的连接查看 HANA Cloud实例连接 Endpoint创建连接选择连接类型配置连接信息,授权方式,用户名密码等配置连接名称验证连接导入数据源表创建目录 Hotel ,放置建模对象点击新建目录,导入远程表选择数据…

isasssim robotiq夹爪踩坑

1. usd导出urdf失败在isasssim的仿真中的 robotiq 2f夹爪,首先目前4.5asset里面的usd不能直接转urdf,因为模型中存在 “闭环连接”,即某个部件(或关节)同时与两个及以上的父部件相连,形成类似 “三角形” 的…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Pokedex(宝可梦图鉴)

📅 我们继续 50 个小项目挑战!—— Pokedex组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ 使用 Vue 3 结合 PokeAPI 来创建一个炫酷的宝可梦图鉴应用。通过这个…

【Practical Business English Oral Scene Interpretation】在职主持会议-安排任务+结束会议

文章目录Introduction1. 讨论代办事项2. 分配工作任务3. 说明截止日期4. 说明截止日期5. 感谢参会者Introduction Note that each row of the table represents the content of the conversation in order. 1. 讨论代办事项 AlexBarryNoteLet’s review the to-dos from the…

ansible简单playbook剧本例子

1. 创建主机清单vim inventory.ini192.168.100.181[web:vars] ansible_userroot ansible_passwordAdmin123456[web] 192.168.100.1822. 创建一个简单的剧本vim playbook.yaml- name: My first playhosts: webtasks:- name: Ping my hostsansible.builtin.ping:- name: Print me…

爱心烟花浪漫立方体轮播图 - 用代码表达爱意

项目介绍 这是一个专为表白和营造浪漫氛围而设计的3D立方体轮播图结合了现代Web技术与浪漫元素,通过立方体的旋转展示珍贵的照片,同时配有爱心飘动、流星划过、烟花绽放和雪花飞舞等浪漫特效,为你的表白增添独特的科技浪漫。 效果展示截图原…

基于人工智能的无人机网络系统

目录 1.环境感知与目标检测 2.无人机定位与导航(SLAM与路径规划) 3.无人机网络通信与资源优化 4.无人机集群协同控制(一致性与编队) 5.无人机任务分配与调度(组合优化) 6.MATLAB仿真测试 基于人工智能…

nginx安装配置Lua模块的支持

一、先来看几个概念问题1.1 为什么需要?nginx官方自带了非常多的核心模块,再加上第三方的模块能够满足我们大部分的业务需要,但是业务的需求、业务的场景变化需要添加一些额外的功能,如果自己去开发一个nginx模块相对来说比较笨重…

智慧矿山低光照识别准确率↑32%:陌讯多模态融合算法实战解析

原创声明本文为原创技术解析,核心技术参数与架构引用自《陌讯技术白皮书》,禁止未经授权的转载与商用。一、行业痛点:智慧矿山的视觉识别困境矿山场景的视觉监控一直面临多重技术挑战:井下巷道长期处于低光照环境(光照…

AI赋能操作系统:通往智能运维的未来

一、具备AI能力的操作系统未来的操作系统如果具备了AI能力,那将彻底改变我们管理和保护服务器的方式。一旦AI能力被充分集成并启用,自动优化、安全检测和漏洞修复的潜力将变得无比巨大且切实可行。想象一下未来的服务器管理:不再需要人工夜以…

sqli-labs:Less-13关卡详细解析

1. 思路🚀 本关的SQL语句为: $sql"SELECT username, password FROM users WHERE username($uname) and password($passwd) LIMIT 0,1";注入类型:字符串型(单引号、括号包裹)、POST请求提示:参数…

微软发布Microsoft Sentinel数据湖国际版

在网络安全威胁持续升级的背景下,微软宣布推出Microsoft Sentinel数据湖(国际版),以突破性架构重塑企业安全运营能力。该产品目前已进入公开预览阶段,标志着安全信息与事件管理(SIEM)领域正式迈…

力扣面试150题--只出现一次的数字II

Day 92 题目描述思路 初次思路:想不出来 哈哈哈指挥hash 就不放出来丢人了 题解思路:这个做法是每次确定一个位是否为答案为1 的位 具体是这样的:由于除了答案外每个数字都会出现3次,那么我们不考虑答案的情况,那么一个…

cacti的RCE

一、环境搭建 1、安装docker curl -fsSL https://get.docker.com | sh 验证docker是否正确安装 docker version 验证docker compose是否可用 docker compose version 2、在GitHub上拉取 vulhub 首先先装一个proxychains网络代理工具,如果直接拉取的话速度会…

Spark SQL 的 SQL 模式和 DSL模式

下面我将详细讲解如何使用 Spark SQL 分别通过 SQL 模式和 DSL(Domain Specific Language)模式实现 WordCount 功能。WordCount 是大数据处理中的经典案例,主要功能是统计文本中每个单词出现的次数。准备工作首先需要初始化 SparkSession&…

03 基于sklearn的机械学习-线性回归、损失函数及其推导

线性回归 分类的目标变量是标称型数据,回归是对连续型的数据做出预测。 一、标称型数据(Nominal Data) 标称型数据属于分类数据(Categorical Data) 的一种,用于描述事物的类别或属性,没有顺序或…