【Linux】GCC编译器(七)
文章目录
- 初步了解
- 安装 GCC
- 编译第一个程序
- 编译选项
初步了解
-
GCC是GNU Compiler Collection的缩写,是一个由GNU项目开发的编译器集合。
-
GCC的历史和发展:GCC最初由理查德·斯托曼(Richard Stallman)发起,目的是创建一个自由的Unix操作系统。1987年,GCC首次发布,它最初只能编译C语言。随后,GCC迅速发展,逐渐添加了对其他编程语言的支持,并成为了许多操作系统的标准编译器。目前,GCC已经成为了一个功能强大的编译器集合,支持多种语言,并且在开源社区中得到了广泛应用和贡献。
-
GCC的主要组件和功能:GCC由多个组件组成,其中最重要的包括:
- 前端(Frontend):负责将源代码转换为中间表示(IR),不同的前端用于处理不同的编程语言,例如C、C++、Objective-C、Fortran、Ada等。
- 中间层(Middle-end):负责优化中间表示的代码,以提高程序的性能和效率。
- 后端(Backend):将优化后的中间表示代码转换为目标平台的机器代码。
- 运行时库(Runtime Libraries):包括各种标准库和运行时支持库,为程序提供所需的功能和支持。
-
GCC支持的编程语言:GCC是一个多语言编译器集合,它支持多种编程语言,如常见的C、C++、Objective-C、Go等
-
为什么学习GCC?
GCC的通用性使得它在不同的操作系统和平台上都能够使用,包括Linux、Unix、macOS等,这使得开发者可以使用同一套工具在不同的环境下进行开发,提高了开发的效率和一致性。
其次,作为自由软件,GCC的源代码可以被任何人查看、修改和分享,这使得开发者可以自由地定制和扩展编译器,满足自己特定的需求
此外,GCC拥有丰富的功能和选项,支持多种编程语言,包括C、C++、Objective-C、Fortran等,可以满足各种不同项目的需求,从小型工具到大型软件项目。
同时,GCC还提供了强大的优化功能,可以帮助开发者提高程序的性能和效率。
除此之外,GCC已经成为了许多开发环境和工具链的标准组件,许多集成开发环境(IDE)和构建工具都提供了对GCC的支持,这使得开发者可以更轻松地使用GCC进行开发和构建。
最后,学习GCC可以帮助开发者更深入地了解编译过程和底层原理,包括预处理、编译、汇编和链接等各个阶段的工作原理,从而提高编程能力和理解能力。
安装 GCC
-
安装GCC:如果你使用的是Linux操作系统,通常可以通过系统自带的包管理器来安装GCC。比如,在基于Debian的系统(如Ubuntu)上,你可以使用以下命令来安装GCC:
sudo apt-get update sudo apt-get install gcc如果你使用的是Windows,你可以考虑使用MinGW等工具来安装GCC。
Visual Studio Code编辑器也支持GCC。
-
确认GCC版本:安装完成后,你可以使用以下命令来确认GCC的版本:
gcc --version
编译第一个程序
#include <stdio.h>
int main() {printf("Hello, world!\n");return 0;
}
代码编译过程是将源代码转换为可执行程序的过程,通常包括以下几个主要阶段(顺序执行):
- 预处理(Preprocessing):在这个阶段,预处理器会处理源代码,执行诸如宏替换、条件编译、删除注释等操作。在这个阶段,
#include <stdio.h>会被替换为stdio.h文件中的内容,使得程序能够使用printf等函数。预处理后的代码会直接输入到终端,可以重定向到自定义文件。 - 编译(Compilation):在这个阶段,编译器将预处理后的源代码转换为汇编代码(assembly code),生成汇编文件。这个汇编代码是针对特定平台的,并且是与机器无关的中间表示形式。编译之后会生成一个新的文件,通常以
.s为扩展名。 - 汇编(Assembly):汇编器会将汇编代码转换为目标平台上的机器代码(object code)。汇编器会将汇编指令翻译成二进制形式,生成目标文件(object file),通常以
.o或.obj为扩展名。 - 链接(Linking):在这个阶段,链接器将编译后的目标文件与所需的库文件进行链接,生成最终的可执行文件。例如,
printf**函数在标准C库中,链接器会将程序与标准C库进行链接以确保程序可以调用printf函数。
使用vim编辑好以上程序后,即可输入以下命令开始编译:
gcc -o hello_world hello_world.c
./hello_world
这个命令将会编译hello_world.c文件,并生成名为hello_world的可执行文件。运行./hello_world**命令将会执行这个可执行文件,输出Hello, world!到终端上。
gcc没有选项时,会顺序执行上面四个步骤,最后生成一个可执行文件,若是没有指定输出文件名的话,会生成默认的a.out可执行文件。
编译选项
GCC具有许多常用的编译选项,这些选项可以帮助你控制编译过程的行为并优化编译输出。以下是一些常用的编译选项:
- 输出选项:
-E:只进行预处理,生成预处理后的源代码,并直接输出到终端。-S:只进行预处理和编译,生成汇编代码,通常以.s为扩展名。-c:只进行预处理,编译和汇编,生成机器码文件,通常以.o或.obj为扩展名。-o <output>:指定输出文件的名称。
- 优化选项:
-O0:关闭优化。-O1:默认值,基本优化,可以提高程序的执行速度和减小程序的体积。-O2:更进一步的优化,会花费更多时间进行编译,但通常会获得更好的性能。-O3:更高级的优化,可能会进行一些更激进的优化,但也可能导致编译时间增加。
- 警告选项:
-Wall:开启所有警告信息。
- 调试选项:
-g:生成调试信息,包括源代码行号和变量信息,以便用于调试器调试程序。-ggdb:生成调试信息,适用于GNU调试器(GDB)。
优化编译输出可以通过调整优化选项来实现。根据需要,你可以根据程序的特性和目标平台选择不同的优化级别。例如,如果你想最大限度地提高程序的性能,可以选择-O3选项。而如果你想在调试阶段获得更好的可读性和可调试性,可以选择使用-g选项生成调试信息。
调试选项可以帮助你在调试程序时更容易地定位问题并理解程序的行为。通过生成调试信息,你可以在调试器中查看源代码行号、变量信息等,从而更轻松地进行调试。
相关文章:
【Linux】GCC编译器(七)
文章目录 初步了解安装 GCC编译第一个程序编译选项 初步了解 GCC是GNU Compiler Collection的缩写,是一个由GNU项目开发的编译器集合。 GCC的历史和发展:GCC最初由理查德斯托曼(Richard Stallman)发起,目的是创建一个…...
【目录整理】(五)
Git 基础 Git 详细安装教程文章浏览阅读10w次,点赞9.6k次,收藏1.7w次。Git 是个免费的开源分布式版本控制系统,下载地址为git-scm.com 或者 gitforwindows.org,本文介绍 Git-2.40.0-64-bit.exe 版本的安装方法&#x…...
项目:USB键盘和鼠标的复合设备
我们的复合设备使用一个物理设备就可以完成多个功能。 使用复合设备同时完成USB键盘和鼠标功能,它的主要实现方式有两种, 第一个就是我们将多个设备描述符合并成一个,这个相对比较简单,我们只要根据相应的报告描述符处理数据就可…...
Linux利用Jenkins部署SpringBoot项目保姆级教程
在当今快速发展的软件开发领域,持续集成和持续部署(CI/CD)已经成为提升开发效率、缩短产品上市时间的关键实践。Linux系统以其稳定性和开源友好性,成为众多开发者和企业的首选平台。而Spring Boot,作为一个轻量级的Jav…...
elementUI 输入框按回车刷新页面问题
分析原因: 当 el-form 表单内只有一个 el-input 输入框时,且type为text类型时,在输入框内按回车就会触发表单的提交事件。 而当 el-form 表单内有多个 el-input 输入框时,按回车不会执行任何操作。 使用.prevent修饰符来阻止默…...
C++的字节对齐
什么是字节对齐 参考什么是字节对齐,为什么要对齐? 现代计算机中,内存空间按照字节划分,理论上可以从任何起始地址访问任意类型的变量。但实际中在访问特定类型变量时经常在特定的内存地址访问,这就需要各种类型数据按照一定的规…...
ALPHA开发板上的PHY芯片驱动:LAN8720驱动
一. 简介 前面文章了解到,Linux内核是有提供 PHY通用驱动的。 本文来简单了解一下ALPHA开发板上的 PHY网络芯片LAN8720的驱动。是 LAN8720芯片的公司提供的 PHY驱动。 二. ALPHA开发板上的PHY芯片驱动:LAN8720驱动 我 们 来 看 一 下 LAN8720A 的 …...
C语言游戏实战(9):球球大作战
前言: 这款简易版的球球大作战是一款单人游戏,玩家需要控制一个小球在地图上移动,吞噬其他小球来增大自己的体积。本游戏使用C语言和easyx图形库编写,旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代码之前…...
【Windows】关闭自动更新
右键单击“此电脑”,点击“管理”。 找到:任务计划程序 -> 任务计划程序库 -> Microsoft -> Windows -> WindowsUpdate 右键单击Scheduled Start任务,然后点击“禁用”即可。 可能还会存在左下角提示更新重启的字样&#x…...
mac如何检测移动硬盘 mac硬盘检测工具 Tuxera怎么用 Tuxera NTFS官网
在工作学习中,我们都绕不开用移动硬盘来拷贝存储一些文件。但是在使用过程中,我们经常遇到“mac检测不到移动硬盘”“移动硬盘不存在”等问题,今天本文就带大家了解下mac如何检测移动硬盘,mac硬盘检测工具。 一、mac如何检测移动…...
1038 Recover the Smallest Number
idea 给出若干个可能含有前导0的数字串,将其进行拼接使其组成的数最小。 拼接串,想到借助string。 找最小,样例中的32,321, 3214尤为具备代表性,让字典序小的数尽可能靠前,联想到string的比较规则也是字典序 >判断…...
【Go】四、包名、访问范围控制、标识符、运算符
文章目录 1、_2、包名3、命名大小影响可访问范围4、运算符5、获取终端输入 1、_ 下划线"_"本身在Go中是一个特殊的标识符,称为空标识符用于忽略某个值 1)忽略导入的没使用的包 2)忽略某个返回值 2、包名 main包是程序的入口包&a…...
达梦数据库日志文件管理
达梦数据库日志文件管理 联机重做日志管理归档日志文件管理开启归档模式:SQL开启归档模式:dmarch.ini归档文件切换和删除 联机重做日志管理 检查联机重做日志: select * from v$rlog; --CUR_FILE表示正在使用的日志文件编号select * fr…...
zookeeper 监控 与 JVM 设置
一、通过JMX监控 JVM 默认情况下,在 ./bin/zkServer.sh 脚本中是默认开启了JMX监控的,并且是不需要认证的,详情可见ZOOMAIN变量; ZOOMAIN"-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port$JMXPORT -D…...
【java】关于String、StringBuffer和StringBuilder的那些事
在之前的文章中我们曾简单介绍过String这个引用类型变量,其实它还有许多特性,还有StringBuffer和StringBuilder这两个方法在字符串操作中也有非常重要的地位,接下来就由小编带大家梳理一下吧👊 目录 一、String 1、构造方法 2、…...
Spring 的 Ioc配置
HappyComponent.java package com.atguigu.Ioc_01;public class HappyComponent {// 默认包含无参的构造方法public void dowork(){System.out.println("HappyComponent.dowork");} }ClientService.java package com.atguigu.Ioc_01;静态工厂类 public class Clien…...
基于Java-SpringBoot+vue实现的前后端分离信息管理系统设计和实现
基于Java-SpringBootvue实现的前后端分离信息管理系统设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐…...
用Python实现办公自动化(自动化处理PDF文件)
自动化处理 PDF 文件 目录 自动化处理 PDF 文件 谷歌浏览器 Chrome与浏览器驱动ChromeDriver安装 (一)批量下载 PDF 文件 1.使用Selenium模块爬取多页内容 2.使用Selenium模块下载PDF文件 3.使用urllib模块来进行网页的下载和保存 4.使用urllib…...
银河麒麟操作系统Kylin Linux 离线安装Nginx1.21.5
一、查看操作系统版本号 nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 4.19.90-52.15.v2207.ky10.x86_64Build: Kylin Linux Advanced Server release V10 (SP3) /(Lance)-x86_64-Build20/…...
ApiFox 使用教程
ApiFox 使用教程 目录概述需求: 设计思路实现思路分析1.基本使用教程(Apifox 使用 Postman)Apifox 下使用 mockapifox 下 swaggerApifox 下使用 Jmeter 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
