当前位置: 首页 > news >正文

【Linux】GCC编译器(七)

文章目录

      • 初步了解
      • 安装 GCC
      • 编译第一个程序
      • 编译选项

初步了解

  1. GCC是GNU Compiler Collection的缩写,是一个由GNU项目开发的编译器集合。

  2. GCC的历史和发展:GCC最初由理查德·斯托曼(Richard Stallman)发起,目的是创建一个自由的Unix操作系统。1987年,GCC首次发布,它最初只能编译C语言。随后,GCC迅速发展,逐渐添加了对其他编程语言的支持,并成为了许多操作系统的标准编译器。目前,GCC已经成为了一个功能强大的编译器集合,支持多种语言,并且在开源社区中得到了广泛应用和贡献。

  3. GCC的主要组件和功能:GCC由多个组件组成,其中最重要的包括:

    • 前端(Frontend):负责将源代码转换为中间表示(IR),不同的前端用于处理不同的编程语言,例如C、C++、Objective-C、Fortran、Ada等。
    • 中间层(Middle-end):负责优化中间表示的代码,以提高程序的性能和效率。
    • 后端(Backend):将优化后的中间表示代码转换为目标平台的机器代码。
    • 运行时库(Runtime Libraries):包括各种标准库和运行时支持库,为程序提供所需的功能和支持。
  4. GCC支持的编程语言:GCC是一个多语言编译器集合,它支持多种编程语言,如常见的C、C++、Objective-C、Go等

  5. 为什么学习GCC?

    GCC的通用性使得它在不同的操作系统和平台上都能够使用,包括Linux、Unix、macOS等,这使得开发者可以使用同一套工具在不同的环境下进行开发,提高了开发的效率和一致性。

    其次,作为自由软件,GCC的源代码可以被任何人查看、修改和分享,这使得开发者可以自由地定制和扩展编译器,满足自己特定的需求

    此外,GCC拥有丰富的功能和选项,支持多种编程语言,包括C、C++、Objective-C、Fortran等,可以满足各种不同项目的需求,从小型工具到大型软件项目。

    同时,GCC还提供了强大的优化功能,可以帮助开发者提高程序的性能和效率。

    除此之外,GCC已经成为了许多开发环境和工具链的标准组件,许多集成开发环境(IDE)和构建工具都提供了对GCC的支持,这使得开发者可以更轻松地使用GCC进行开发和构建。

    最后,学习GCC可以帮助开发者更深入地了解编译过程和底层原理,包括预处理、编译、汇编和链接等各个阶段的工作原理,从而提高编程能力和理解能力。

安装 GCC

  1. 安装GCC:如果你使用的是Linux操作系统,通常可以通过系统自带的包管理器来安装GCC。比如,在基于Debian的系统(如Ubuntu)上,你可以使用以下命令来安装GCC:

    sudo apt-get update
    sudo apt-get install gcc
    

    如果你使用的是Windows,你可以考虑使用MinGW等工具来安装GCC。

    Visual Studio Code编辑器也支持GCC。

  2. 确认GCC版本:安装完成后,你可以使用以下命令来确认GCC的版本:

    gcc --version
    

编译第一个程序

#include <stdio.h>
int main() {printf("Hello, world!\n");return 0;
}

代码编译过程是将源代码转换为可执行程序的过程,通常包括以下几个主要阶段(顺序执行):

  1. 预处理(Preprocessing):在这个阶段,预处理器会处理源代码,执行诸如宏替换、条件编译、删除注释等操作。在这个阶段,#include <stdio.h>会被替换为stdio.h文件中的内容,使得程序能够使用printf等函数。预处理后的代码会直接输入到终端,可以重定向到自定义文件。
  2. 编译(Compilation):在这个阶段,编译器将预处理后的源代码转换为汇编代码(assembly code),生成汇编文件。这个汇编代码是针对特定平台的,并且是与机器无关的中间表示形式。编译之后会生成一个新的文件,通常以.s为扩展名。
  3. 汇编(Assembly):汇编器会将汇编代码转换为目标平台上的机器代码(object code)。汇编器会将汇编指令翻译成二进制形式,生成目标文件(object file),通常以.o.obj为扩展名。
  4. 链接(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具有许多常用的编译选项,这些选项可以帮助你控制编译过程的行为并优化编译输出。以下是一些常用的编译选项:

  1. 输出选项
    • -E:只进行预处理,生成预处理后的源代码,并直接输出到终端。
    • -S:只进行预处理和编译,生成汇编代码,通常以.s为扩展名。
    • -c:只进行预处理,编译和汇编,生成机器码文件,通常以.o.obj为扩展名。
    • -o <output>:指定输出文件的名称。
  2. 优化选项
    • -O0:关闭优化。
    • -O1:默认值,基本优化,可以提高程序的执行速度和减小程序的体积。
    • -O2:更进一步的优化,会花费更多时间进行编译,但通常会获得更好的性能。
    • -O3:更高级的优化,可能会进行一些更激进的优化,但也可能导致编译时间增加。
  3. 警告选项
    • -Wall:开启所有警告信息。
  4. 调试选项
    • -g:生成调试信息,包括源代码行号和变量信息,以便用于调试器调试程序。
    • -ggdb:生成调试信息,适用于GNU调试器(GDB)。

优化编译输出可以通过调整优化选项来实现。根据需要,你可以根据程序的特性和目标平台选择不同的优化级别。例如,如果你想最大限度地提高程序的性能,可以选择-O3选项。而如果你想在调试阶段获得更好的可读性和可调试性,可以选择使用-g选项生成调试信息。

调试选项可以帮助你在调试程序时更容易地定位问题并理解程序的行为。通过生成调试信息,你可以在调试器中查看源代码行号、变量信息等,从而更轻松地进行调试。

相关文章:

【Linux】GCC编译器(七)

文章目录 初步了解安装 GCC编译第一个程序编译选项 初步了解 GCC是GNU Compiler Collection的缩写&#xff0c;是一个由GNU项目开发的编译器集合。 GCC的历史和发展&#xff1a;GCC最初由理查德斯托曼&#xff08;Richard Stallman&#xff09;发起&#xff0c;目的是创建一个…...

【目录整理】(五)

​​​​​Git 基础 Git 详细安装教程文章浏览阅读10w次&#xff0c;点赞9.6k次&#xff0c;收藏1.7w次。Git 是个免费的开源分布式版本控制系统&#xff0c;下载地址为git-scm.com 或者 gitforwindows.org&#xff0c;本文介绍 Git-2.40.0-64-bit.exe 版本的安装方法&#x…...

项目:USB键盘和鼠标的复合设备

我们的复合设备使用一个物理设备就可以完成多个功能。 使用复合设备同时完成USB键盘和鼠标功能&#xff0c;它的主要实现方式有两种&#xff0c; 第一个就是我们将多个设备描述符合并成一个&#xff0c;这个相对比较简单&#xff0c;我们只要根据相应的报告描述符处理数据就可…...

Linux利用Jenkins部署SpringBoot项目保姆级教程

在当今快速发展的软件开发领域&#xff0c;持续集成和持续部署&#xff08;CI/CD&#xff09;已经成为提升开发效率、缩短产品上市时间的关键实践。Linux系统以其稳定性和开源友好性&#xff0c;成为众多开发者和企业的首选平台。而Spring Boot&#xff0c;作为一个轻量级的Jav…...

elementUI 输入框按回车刷新页面问题

分析原因&#xff1a; 当 el-form 表单内只有一个 el-input 输入框时&#xff0c;且type为text类型时&#xff0c;在输入框内按回车就会触发表单的提交事件。 而当 el-form 表单内有多个 el-input 输入框时&#xff0c;按回车不会执行任何操作。 使用.prevent修饰符来阻止默…...

C++的字节对齐

什么是字节对齐 参考什么是字节对齐&#xff0c;为什么要对齐? 现代计算机中&#xff0c;内存空间按照字节划分&#xff0c;理论上可以从任何起始地址访问任意类型的变量。但实际中在访问特定类型变量时经常在特定的内存地址访问&#xff0c;这就需要各种类型数据按照一定的规…...

ALPHA开发板上的PHY芯片驱动:LAN8720驱动

一. 简介 前面文章了解到&#xff0c;Linux内核是有提供 PHY通用驱动的。 本文来简单了解一下ALPHA开发板上的 PHY网络芯片LAN8720的驱动。是 LAN8720芯片的公司提供的 PHY驱动。 二. ALPHA开发板上的PHY芯片驱动&#xff1a;LAN8720驱动 我 们 来 看 一 下 LAN8720A 的 …...

C语言游戏实战(9):球球大作战

前言&#xff1a; 这款简易版的球球大作战是一款单人游戏&#xff0c;玩家需要控制一个小球在地图上移动&#xff0c;吞噬其他小球来增大自己的体积。本游戏使用C语言和easyx图形库编写&#xff0c;旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代码之前&#xf…...

【Windows】关闭自动更新

右键单击“此电脑”&#xff0c;点击“管理”。 找到&#xff1a;任务计划程序 -> 任务计划程序库 -> Microsoft -> Windows -> WindowsUpdate 右键单击Scheduled Start任务&#xff0c;然后点击“禁用”即可。 可能还会存在左下角提示更新重启的字样&#x…...

mac如何检测移动硬盘 mac硬盘检测工具 Tuxera怎么用 Tuxera NTFS官网

在工作学习中&#xff0c;我们都绕不开用移动硬盘来拷贝存储一些文件。但是在使用过程中&#xff0c;我们经常遇到“mac检测不到移动硬盘”“移动硬盘不存在”等问题&#xff0c;今天本文就带大家了解下mac如何检测移动硬盘&#xff0c;mac硬盘检测工具。 一、mac如何检测移动…...

1038 Recover the Smallest Number

idea 给出若干个可能含有前导0的数字串&#xff0c;将其进行拼接使其组成的数最小。 拼接串&#xff0c;想到借助string。 找最小&#xff0c;样例中的32,321, 3214尤为具备代表性&#xff0c;让字典序小的数尽可能靠前&#xff0c;联想到string的比较规则也是字典序 >判断…...

【Go】四、包名、访问范围控制、标识符、运算符

文章目录 1、_2、包名3、命名大小影响可访问范围4、运算符5、获取终端输入 1、_ 下划线"_"本身在Go中是一个特殊的标识符&#xff0c;称为空标识符用于忽略某个值 1&#xff09;忽略导入的没使用的包 2&#xff09;忽略某个返回值 2、包名 main包是程序的入口包&a…...

达梦数据库日志文件管理

达梦数据库日志文件管理 联机重做日志管理归档日志文件管理开启归档模式&#xff1a;SQL开启归档模式&#xff1a;dmarch.ini归档文件切换和删除 联机重做日志管理 检查联机重做日志&#xff1a; select * from v$rlog; --CUR_FILE表示正在使用的日志文件编号select * fr…...

zookeeper 监控 与 JVM 设置

一、通过JMX监控 JVM 默认情况下&#xff0c;在 ./bin/zkServer.sh 脚本中是默认开启了JMX监控的&#xff0c;并且是不需要认证的&#xff0c;详情可见ZOOMAIN变量&#xff1b; ZOOMAIN"-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port$JMXPORT -D…...

【java】关于String、StringBuffer和StringBuilder的那些事

在之前的文章中我们曾简单介绍过String这个引用类型变量&#xff0c;其实它还有许多特性&#xff0c;还有StringBuffer和StringBuilder这两个方法在字符串操作中也有非常重要的地位&#xff0c;接下来就由小编带大家梳理一下吧&#x1f44a; 目录 一、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实现的前后端分离信息管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐…...

用Python实现办公自动化(自动化处理PDF文件)

自动化处理 PDF 文件 目录 自动化处理 PDF 文件 谷歌浏览器 Chrome与浏览器驱动ChromeDriver安装 &#xff08;一&#xff09;批量下载 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 使用教程 目录概述需求&#xff1a; 设计思路实现思路分析1.基本使用教程&#xff08;Apifox 使用 Postman&#xff09;Apifox 下使用 mockapifox 下 swaggerApifox 下使用 Jmeter 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show…...

github拉取的项目添加至自己的仓库

想把GitHub的开源项目拉到本地进行二开&#xff0c;研究了一下上传到gitee的步骤&#xff1a; 步骤 gitee新建仓库&#xff0c;仓库名与本地文件夹的名称一致&#xff0c;建好后gitee的页面也会有显示git命令 打开项目目录&#xff0c;右键打开git bash&#xff08;或者在gi…...

ZooKeeper 的持久化机制

持久化的定义&#xff1a; 数据&#xff0c;存到磁盘或者文件当中。机器重启后&#xff0c;数据不会丢失。内存 -> 磁盘的映射&#xff0c;和序列化有些像。 ZooKeeper 的持久化&#xff1a; SnapShot 快照&#xff0c;记录内存中的全量数据TxnLog 增量事务日志&#xff…...

VS2022+QT5.9 提示找不到qtmain.lib

从VS2013QT的项目切换到VS2022QT5.9&#xff0c;安装好mscv2017版本的QT5.9&#xff0c;项目工程选择QT project settings中的Qt Installation为mscv2017版本的QT5.9&#xff0c;编译好提示找不到qtmain.lib 解决思路&#xff1a; 提示找到xxxx.lib&#xff0c;第一库目录不对…...

HTTP和HTTPS谁传输数据更安全?

1.HTTP HTTP在传输数据时&#xff0c;通常都是明文传输&#xff0c;也就是传输的数据没有进行加密。在这种情况下&#xff0c;如果传输的是一些敏感数据&#xff0c;比如某银行卡密码&#xff0c;就很容易被别人截获到&#xff0c;这就对我们的个人利益产生了威胁。 HTTP传输数…...

竞赛常考的知识点大总结(七)图论

最短路 最短路问题&#xff08;Shortest Path Problem&#xff09;是图论中的一个经典问题&#xff0c;它要求在给定的图中找到两个顶点之间的最短路径。最短路问题可以是单源最短路问题&#xff08;从一个顶点到其他所有顶点的最短路径&#xff09;或所有对最短路问题&#x…...

NOSQL - Redis的简介、安装、配置和简单操作

目录 一. 知识了解 1. 关系型数据库与非关系型数据库 1.1 关系型数据库 1.2 非关系型数据库 1.3 区别 1.4 非关系型数据库产生背景 1.5 NOSQL 与 SQL的数据记录对比 2. 缓存相关知识 2.1 缓存概念 2.2 系统缓存 2.3 缓存保存位置及分层结构 二 . redis 相关知识 1.…...

书生·浦语大模型开源体系(二)笔记

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…...

docker-compse安装es(包括IK分词器扩展)、kibana、libreoffice

Kibana是一个开源的分析与可视化平台&#xff0c;设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。 Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等&#xff0c;直观的展示数据&#xff0c;从而达到高级的数据…...

Electron 读取本地配置 增加缩放功能(ctrl+scroll)

最近&#xff0c;一个之前做的electron桌面应用&#xff0c;需要增加两个功能&#xff1b;第一是读取本地的配置文件&#xff0c;然后记载配置文件中的ip地址&#xff1b;第二就是增加缩放功能&#xff1b; 第一&#xff0c;配置本地文件 首先需要在vue工程根目录中&#xff0…...

docker中配置交互式的JupyterLab环境的问题

【报错1】 Could not determine jupyter lab build status without nodejs 【解决措施】安装nodejs(利用conda进行安装/从官网下载进行安装&#xff09; 1、conda安装 conda install -c anaconda nodejs 安装后出现其他报错&#xff1a;Please install nodejs 5 and npm bef…...

网站的设计方法有哪些/广州现在有什么病毒感染

使用 java 进行文件拷贝 相信很多人都会用,,不过效率上是否最好呢?最近看了看NIO决定试一试 java NIO 到底有什么性能的提升.第一种方法:古老的方式public static long forJava(File f1,File f2) throws Exception{long timenew Date().getTime();int length2097152;FileInput…...

佛山专业做网站/seo关键词工具

展开全部采用对接拼缝&#xff0c;可以处理明显接缝&#xff0c;对接拼缝是将壁纸的边缘互相紧靠在一起。既不重叠32313133353236313431303231363533e58685e5aeb931333431353936&#xff0c;也不留缝隙。这种拼缝方法优点是平整、光滑、无痕迹&#xff0c;给人的感觉是完整流畅…...

运动服饰网站建设目的/2022年小学生新闻摘抄十条

text-align 属性规定元素中的文本的水平对齐方式。该属性通过指定行框与哪个点对齐&#xff0c;从而设置块级元素内文本的水平对齐方式。通过允许用户代理调整行内容中字母和字之间的间隔&#xff0c;可以支持值 justify&#xff1b;不同用户代理可能会得到不同的结果。 <!…...

做网站 绍兴/友链

1. Environment.GetFolderPath(Environment.SpecialFolder)Environment.SpecialFolder.ApplicationFolder即为Roaming文件夹的路径2. Environment.GetEnvironmentVariable(string)可遍历支持的类型&#xff1a; foreach (DictionaryEntry de in Environment.GetEnvironmentVari…...

如何知道自己网站租用的服务器去/seo运营学校

1.1 今日目标理解多表查询理解子查询能够创建视图能够删除视图能够查看创建视图的SQL语句能够理解事务的作用能够操作事务理解索引的作用能够创建索引能够删除索引知道常用的函数了解预处理语句的作用能够使用预处理语句了解存储过程的作用能够创建存储过程能够调用存储过程能够…...

免费微信小程序制作/百度seo流量

链表05--复杂链表的复制-jz25题目概述解析&参考答案注意事项说明题目概述 算法说明 输入一个复杂链表&#xff08;每个节点中有节点值&#xff0c;以及两个指针&#xff0c;一个指向下一个节点&#xff0c;另一个特殊指针random指向一个随机节点&#xff09;&#xff0c;请…...