【Linux】 开始使用 gcc 吧!!!

news2024/11/17 9:27:14

在这里插入图片描述

Linux

  • 1 认识gcc
  • 2 背景知识
  • 3 gcc 怎样完成 ?
    • 3.1 预处理
      • 预处理
      • ^条件编译
    • 3.2 编译
    • 3.3 汇编
    • 3.4 链接
  • 4 函数库
  • 5 gcc 基本选项
  • Thanks♪(・ω・)ノ谢谢阅读
  • 下一篇文章见!!!

1 认识gcc

我们在windows环境和macos环境里都有功能强大的集成开发环境(IDE)供我们使用
,但是在Linux中我们如何编译运行我们的代码呢?这里就需要使用gcc / g++ 了。

2 背景知识

在学习使用gcc之前,我们需要了解代码的编译过程(可以看文章: 编译与链接):

  1. 预处理 (进行宏替换,去注释,头文件展开等)
  2. 编译(将 C语言 转换为 汇编语言 )
  3. 汇编(将 汇编语言 转换 二进制目标文件)
  4. 链接 (形成可执行程序)

3 gcc 怎样完成 ?

了解了上述背景知识,我们需要通过gcc来帮助我们实现这四个步骤,让代码可以成功运行。
gcc [选项] 要编译的文件 [选项] [目标文件]
这一步指令就可以帮助我们得到可执行程序。效果如下:
在这里插入图片描述
我们接下来再来看具体每一步的操作如何实现

3.1 预处理

预处理

预处理指令:
gcc -E 要预处理的文件 [选项] [目标文件]
一般我们得到的预处理文件使用.i后缀
我们可以验证一下预处理是不是完成去注释等操作:
在这里插入图片描述
可以看到经过预处理之后,我们的代码变成了近千行,这就是对头文件进行的引用展开(去注释后),展开宏定义的效果。

^条件编译

先引入一个问题,一个产品的不同版本(个人版 社区版 专业版)需要维护几个文件???
答案是: 一个
条件编译就是实现这个的重要方法;
在这里插入图片描述
通过条件编译我们就实现了对于一个代码的不同版本实现!!!

3.2 编译

编译指令:
gcc -S 要编译的文件 [选项] [目标文件]
一般我们得到的编译文件使用.s后缀
我们来看看是不是可以成功转换为汇编语言:
在这里插入图片描述
可以看到刚才的近千行代码成为了使用汇编语言的文件。

3.3 汇编

汇编指令:
gcc -c 要汇编的文件 [选项] [目标文件]
一般我们得到的二进制文件使用.o后缀
我们来看看是不是可以成功转换成二进制文件:
在这里插入图片描述
现在使用 vim 打开后是乱码,大致可以理解是已经转换成二进制了。

3.4 链接

链接指令:
gcc 要链接的文件 [选项] [目标文件]
一般我们得到的可执行文件使用.exe后缀
我们来执行这一步看看效果:
在这里插入图片描述

成功执行!!!

4 函数库

我们的代码中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢???
答案是:
系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函 数“printf”了,而这也就是链接的作用
这里的库又分为动态库 和 静态库
在这里插入图片描述

  1. 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a
  2. 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。

gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件

我们看看使用动态库和静态库的区别:
在这里插入图片描述

使用静态库的可执行文件比使用动态库的文件大了近100倍
这就是因为静态库把库加到了可执行文件里。让文件的可移植性大大加强!当然所占内存也打了不少。

5 gcc 基本选项

  1. E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  2. -S 编译到汇编语言不进行汇编和链接
  3. -c 编译到目标代码
  4. -o 文件输出到 文件
  5. -static 此选项对生成的文件采用静态链接
  6. -g 生成调试信息。GNU 调试器可利用该信息。
  7. -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
  8. -O0 -O1 -O2 -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  9. -w 不生成任何警告信息。
  10. -Wall 生成所有警告信息
    具体效果请大家多多尝试!

Thanks♪(・ω・)ノ谢谢阅读

下一篇文章见!!!

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

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

相关文章

02.领域驱动设计:了解领域、子域、核心域、通用域、支撑域、通用语言和限界上下文

目录 概要 1、领域 2、子领域 建立领域模型步骤: 3、核心域 4、通用域 5、支撑域 6、思考题 7、通用语言 8、限界上下文 限界上下文和微服务的关系 9、总结 限界上下文在微服务设计中的作用和意义是什么 概要 领域驱动设计(DDD)…

Web09--jQuery基础

1、jQuery概述 1.1 什么是jQuery jQuery是一款优秀的JavaScript的轻量级框架之一,封装了DOM操作、事件绑定、ajax等功能。特别值得一提的是基于jQuery平台的插件非常丰富,大多数前端业务场景都有其封装好的工具可直接使用。 jQuery下载和版本介绍 官…

qml中访问控件内部的子项

如何访问Repeater类型内部的子项、Row等布局类型内部的子项以及ListView内部的子项等。。。 1、测试代码 import QtQuick 2.0 import QtQuick.Controls 2.12 import QtQuick.Window 2.12 import QtQuick.Layouts 1.3 import QtQml 2.12Window {id: windowobjectName: "m…

彩色图像处理之彩色图像分割的python实现——数字图像处理

原理 彩色图像分割是图像处理领域的一个重要技术,它旨在将一幅彩色图像划分为多个区域或对象。其基本原理包括以下几个方面: 像素特征的提取:彩色图像分割首先涉及到像素级的特征提取。在彩色图像中,常用的特征包括颜色、纹理和…

Javadoc的讲解使用

概述:JavaDoc 是用于生成 Java 代码文档的工具。通过编写 JavaDoc 注释,可以为代码中的类、接口、方法、字段等元素添加文档注释,这些注释将被 JavaDoc 工具解析并生成相应的 HTML 文档。 目录 讲解 使用 结果 讲解 下面是一些关于 Java…

常用通信总线学习——RS232与RS485

RS232概述 RS-232标准接口(又称EIA RS-232)是常用的串行通信接口标准之一,它是由美国电子工业协会(Electronic Industry Association,EIA)联合贝尔系统公司、调制解调器厂家及计算机终端生产厂家于1970年共同制定,其全…

RocketMQ源码阅读-七-高可用

RocketMQ源码阅读-七-高可用 概述NameServer高可用Broker注册到NameServerProducer、Consumer 访问 Namesrv Broker高可用Broker主从配置Master、Slave通信组件Master与Slave的通信协议Slave节点逻辑Master节点逻辑Master_SYNC模式Producer发消息Consumer消费消息 总结 本篇分析…

如何配置Tomcat服务环境并实现无公网ip访问本地站点

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器,不仅名字很有趣&#xff0…

前出深入-机器学习

文章目录 一、K近邻算法1.1 先画一个散列图1.2 使用K最近算法建模拟合数据1.3 进行预测1.4 K最近邻算法处理多元分类问题1.5 K最近邻算法用于回归分析1.6 K最近邻算法项目实战-酒的分类1.6.1 对数据进行分析1.6.2 生成训练数据集和测试数据集1.6.3 使用K最近邻算法对数据进行建…

python3去除图片中的文字水印

声明:本文为python技术分享,仅供学习使用。 请勿用于商业用途!!! 请勿用于商业用途!!! 请勿用于商业用途!!! 以下为代码: import …

LeetCode、875. 爱吃香蕉的珂珂【中等,最小速度二分】

文章目录 前言LeetCode、875. 爱吃香蕉的珂珂【中等,最小速度二分】题目及分类思路分析及代码实现代码优化 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Ja…

多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资…

部署TOMCAT详解

目录 一、Tomcat概述 1.1Tomcat简介 1.2、Tomcat历史 1.3Tomcat官网 二、部署单实例Tomcat 1.下载Tomcat包 2. 解压Tomcat包 3.配置环境变量 4.刷新环境变量 5.查看tomcat是否安装成功 6.启动Tomcat 三、Tomcat目录介绍 1、tomcat主目录介绍 2.webapps目录介绍 3…

Unity——八叉树的原理与实现

八叉树原理 八叉树(Octree)是一种用于在三维空间中进行空间分割的数据结构。它将三维空间递归地划分为八个子空间,每个子空间对应于一个八叉树节点。这种分割方式可以有效地组织和管理场景中的对象,提高检索效率,特别…

会计等式与会计事项

目录 一. 会计等式二. 会计事项 \quad 一. 会计等式 \quad 最后利润是归所有者权益所有, 就回到了原有等式 \quad \quad \quad 二. 会计事项 \quad 会计事项: 引起会计要素增减变化的经济业务。 会计六要素: 资产 负债 所有者权益 收入 费用 利润 任何会计事项都不会破坏会计…

C++ 数论相关题目(欧拉函数、筛法求欧拉函数)

1、欧拉函数 给定 n 个正整数 ai ,请你求出每个数的欧拉函数。 欧拉函数的定义 1∼N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N) 。 若在算数基本定理中,Npa11pa22…pamm ,则: ϕ(N) Np1−1p1p2−1p2…pm−1p…

人工智能时代:让AIGC成为你的外部智慧源(文末送书)

🌈个人主页:聆风吟 🔥系列专栏:数据结构、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. 什么是AIGC?二. AIGC如何运作?2.1 步骤一:收集数据2.…

day32WEB 攻防-通用漏洞文件上传二次渲染.htaccess变异免杀

本章节知识点: 1 、文件上传 - 二次渲染 2 、文件上传 - 简单免杀变异 3 、文件上传 -.htaccess 妙用 4 、文件上传 -PHP 语言特性 前置知识: 后门代码需要用特定格式后缀解析,不能以图片后缀解析脚本后门代码 ( 解析漏洞除外 ) 如&…

Aleo测试网回顾-测试网期间共释放了多少积分

上一篇我们整理了Aleo的详细项目介绍,Aleo项目详细介绍-一个兼顾隐私和可编程性的隐私公链-CSDN博客 接下来,让我们盘点下测试网期间的积分释放情况,测试网期间的奖励积分也将是Aleo主网上线后的抛压来源。测试网期间共计释放了4000万的积分…

2024转行程序员的请注意:均月薪在40-70k

前言 2023年,对大多数行业来说都是不太好过的一年。 对程序员来说也是如此,很多粉丝朋友都在说android工作特别难找,一个岗位都是几千份简历…大家心里都是特别的焦虑,本以为2024年就业情况会有好转,但实际上并非如此…