【Linux】gcc编译器的使用和介绍

目录

一,GCC简介

二,GCC的主要组件

三,GCC的工作流程

四,GCC的一些重要特性和功能

五,GCC常用的编译选项

六,GCC的输入输出选项的具体用法

七,GCC的参考文档


一,GCC简介

  • GCC,全称为GNU Compiler Collection,是一个开源的编译器集合,由自由软件基金会(Free Software Foundation)开发和维护。它是一个跨平台的编译器套件,能够编译多种编程语言,如C、C++、Objective-C等。
  • GCC最初是为GNU操作系统(类Unix操作系统)开发的,但现在已经扩展到可以在多个操作系统和硬件平台上运行,包括Linux、Windows、macOS、BSD及其他UNIX-like系统等。
  • GCC的主要作用是将源代码编译成目标代码(机器码)。它提供了不同语言的编译器前端,用于解析和处理各种编程语言的源代码。然后,GCC通过一系列的编译器后端,将这些源代码转换为目标平台上可执行的机器码或者与特定平台相关的目标代码。

二,GCC的主要组件

  • 前端(Frontend): 它负责处理源代码并将其转换为中间表示(中间代码)。前端处理不同编程语言的语法和语义,并将其转换为一种通用的中间表示,称为GIMPLE(GNU Middle End Intermediate Programming Language)。每种编程语言都有对应的前端,用于解析和处理该语言的源代码。
  • 优化器(Optimizer):它在前端生成的中间表示基础上执行一系列优化操作。优化器通过重组代码、消除冗余操作、提取循环、剪枝不可达代码等技术,改善程序的性能和效率。优化器还可以进行调度、向量化、内联等优化,使程序更有效地利用计算机硬件资源。
  • 后端(Backend):它将优化器优化后的中间表示转换为目标平台上的机器码或者汇编代码。后端根据目标硬件体系结构的特定要求,生成与之匹配的低级指令序列。后端完成目标代码的生成,包括寄存器分配、指令选择、代码调度和基本块布局等过程。
  • 链接器(Linker):链接器是GCC中的最后一个主要组件,在编译完成后起作用。链接器负责将多个目标文件和库文件合并在一起,以生成最终的可执行文件或共享库文件。链接器将不同的代码段和数据段进行合并,并解决符号引用和重定位等问题。它还可以对代码进行一些额外的优化,如去除未被使用的代码和数据。

三,GCC的工作流程

GCC将源代码转换为可执行文件的过程主要包括以下阶段:

  • 预处理(Preprocessing):在编译之前,GCC首先会对源代码进行预处理。预处理器会处理以"#"开头的预处理指令,例如#include、#define等。它的主要任务是展开宏定义、包含头文件、删除注释等。预处理后的代码不再包含预处理指令,而是将其替换为实际代码,产生一个经过预处理的源代码文件。
  • 编译(Compilation):在预处理之后,GCC进入编译阶段。编译器将预处理后的源代码翻译为汇编代码(Assembly Code)。汇编代码是一个与具体处理器相关的低级别代码,使用特定的汇编指令集。编译器进行词法分析、语法分析和语义分析等操作,将源代码转化为一系列汇编指令。
  • 汇编(Assembly):编译代码生成的汇编代码仍然是与特定处理器相关的低级别代码,需要进一步转换为机器语言。这一步骤就是汇编。GCC调用汇编器(Assembler)将汇编代码转换为目标文件(Object File)。目标文件是一种二进制文件,包含了机器码以及相关的元数据(如符号表、重定位表)。
  • 链接(Linking):最后一步是链接器(Linker)将目标文件与必要的库文件进行链接,生成最终的可执行文件。链接器负责解析目标文件中的符号引用,将其与其他目标文件和库文件中的符号定义进行匹配。它还处理重定位信息,将跨模块的符号引用解决为实际的内存地址。最终生成的可执行文件包含了所有的机器码和相关的元数据,可以直接在特定平台上执行。

四,GCC的一些重要特性和功能

  • 多语言支持:GCC支持多种编程语言,包括C、C++、Fortran、Java、Ada等。它为每种语言提供了单独的前端编译器,以便能够根据具体的语言规范进行编译和优化。
  • 可移植性:GCC在多个平台上可用,包括Linux、Windows、macOS等。它被广泛用于各种计算机体系结构,如x86、ARM、PowerPC等。
  • 高度优化:GCC具有可配置的优化级别,可以根据程序的需求进行不同程度的代码优化。它提供了多种优化技术,如循环展开、常量折叠、函数内联等,以提高代码执行效率和性能。
  • 强大的警告机制:GCC具有丰富的警告机制,可以检测代码中的潜在问题和错误,帮助开发人员提早发现和解决问题。警告功能可以帮助编写更规范和安全的代码。
  • 调试支持:GCC与GNU调试器GDB密切配合,提供了强大的调试支持。它可以生成符号表和调试信息,允许开发人员使用调试器来跟踪程序的执行和调试错误。
  • 扩展性:GCC是可扩展的,允许用户自定义编译器的行为。它提供了插件机制和编译选项,供开发人员添加新的编译器扩展、优化技术和目标机器描述。
  • 库支持:GCC支持使用标准库和第三方库。它有自己的运行时库(glibc),提供了丰富的库函数和系统调用封装。此外,GCC还可以链接其他常用库,如数学库、图形库等。
  • 静态和动态链接:GCC支持静态链接和动态链接,可以将程序和库文件静态链接到一个独立的可执行文件中,或者动态链接到运行时共享库。

五,GCC常用的编译选项

  • 输入输出选项:
    • -o <file>:指定生成的可执行文件或目标文件的名称。
    • -E:只进行预处理,将预处理结果输出到标准输出。
    • -S:只进行编译,将汇编代码输出到标准输出。
    • -c:只进行编译,不进行链接。
  • 搜索路径选项:
    • -I<path>:指定头文件搜索路径。
    • -L<path>:指定库文件搜索路径。
    • -l<library>:链接指定的库文件。例如:-lm表示链接数学库libm。
  • 警告选项:
    • -Wall:启用所有警告信息。
    • -Werror:将警告视为错误,并终止编译过程。
    • -Wextra:启用额外的警告信息。
    • -Wpedantic:启用更严格的警告,符合标准的严格语义。
  • 优化选项:
    • -O0:禁用优化。
    • -O1:启用基本优化。
    • -O2:启用更高级别的优化,包括一些耗时较低的优化。
    • -O3:启用进一步的优化,可能会导致编译时间增加。
    • -Os:针对尺寸进行优化。
    • -Ofast:启用更激进的优化,可能会打破一些标准的严格语义规则。
  • 标准选项:
    • -std=<standard>:指定要遵循的C或C++标准版本。
  • 多线程选项:
    • -pthread:使用线程库。启用对多线程编程的支持。
  • 宏定义选项:
    • -D<macro>:定义一个宏。可以使用格式-D<macro>[=<value>]定义带有可选值的宏。
  • 内存检测选项:
    • -fsanitize=<options>:开启内存检测选项。
    • address:开启地址访问错误检测。
    • leak:开启内存泄漏检测。
  • CPU架构选项:
    • -march=<arch>:设定目标处理器的CPU架构。
  • 目标平台选项:
    • -march=:指定目标平台的处理器架构。例如:-march=armv8-a
    • -mcpu=:指定目标平台的处理器型号。例如:-mcpu=cortex-a53
  • 其他选项:
    • -M<file>:生成文件的依赖关系。
    • -f<feature>:开启或关闭指定的编译器功能。

六,GCC的输入输出选项的具体用法

  • 编译并生成可执行文件:以下命令是将myprog.c编译为可执行文件myprog
    • gcc -o output_file input_file.c
    • 多文件编译:如果程序由多个源文件组成,可以一起编译
    • gcc -o output_file input_file1.c input_file2.c
  • 进行预处理并输出到文件:以下命令是对myprog.c进行预处理,并将预处理结果输出到myprog.i文件中。
    • gcc -E input_file.c -o output_file.i
  • 进行编译并输出汇编代码:以下命令将myprog.c只编译为汇编代码,并将汇编代码输出到myprog.s文件中。
    • gcc -S input_file.c -o output_file.s
  • 编译并生成目标文件:以下命令将myprog.c编译为目标文件myprog.o。
    • gcc -c input_file.c -o output_file.o
  • 编译目标文件生成可执行文件:以下命令将myprog.c编译为目标文件myprog。
    • gcc input_file.o -o output_file
  • 指定头文件搜索路径:以下命令将在/usr/local/lib目录中搜索库文件,并链接数学库-lm,然后编译myprog.c为可执行文件myprog
    • gcc -I/usr/local/include input_file.c -o output_file
  • 指定库文件搜索路径及链接库文件:以下命令将在/usr/local/lib目录中搜索库文件,并链接数学库-lm,然后编译myprog.c为可执行文件myprog
    • gcc -L/usr/local/lib -lm input_file.c -o output_file

七,GCC的参考文档

  • GNU编程指南:这个指南是针对GCC的,涵盖了编译器选项、编译过程、调试和优化等主题。
  • GCC Wiki:这个维基页面提供了关于GCC的丰富信息,包括选项解释、示例和最佳实践。
  • GNU编译器文档:这是gcc官方文档,包含了gcc的各种选项和用法的详细说明。
  • Linux man手册:在终端输入man gcc可以查看gcc的man手册页面。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI语音工牌在通讯行业营业大厅场景应用

在运营商营业大厅中&#xff0c;每天都有大量的客户来访咨询、办理业务。同时也会经常产生大量的客诉纠纷和服务差评。但因为缺乏有效的管理工具&#xff0c;加上线下沟通场景的数据采集难度高&#xff0c;数字化程度低&#xff0c;管理一直处于盲区。如何有效的管控营业厅人员…

2023最新Windows编译ffmpeg详细教程,附msys2详细安装配置教程

安装MSYS2 msys2是一款跨平台编译套件&#xff0c;它模拟linux编译环境&#xff0c;支持整合mingw32和mingw64&#xff0c;能很方便的在windows上对一些开源的linux工程进行编译运行。 类似的跨平台编译套件有&#xff1a;msys&#xff0c;cygwin&#xff0c;mingw 优势&…

【密码学】六、公钥密码

公钥密码 1、概述1.1设计要求1.2单向函数和单向陷门函数 2、RSA公钥密码体制2.1加解密2.2安全性分析 3、ElGamal公钥密码体制3.1加解密算法3.2安全性分析 4、椭圆曲线4.1椭圆曲线上的运算4.2ECC 5、SM2公钥密码体制5.1参数选取5.2密钥派生函数5.3加解密过程5.3.1初始化5.3.2加密…

Maven引入本地jar包

maven做为一种强大的依赖管理工具&#xff0c;可以帮助我们更方便的管理项目中的依赖&#xff1b;而在使用过程中我们难免会有需要引入本地jar包的需求&#xff0c;这里踩过坑之后我分享俩种引入方式&#xff1b; 1.上传jar到本地maven仓库&#xff0c;再引入 使用此方法后可…

最强自动化测试框架Playwright-操作指南(3)-PO模式

playwright支持PO模式 创建页面对象 class SearchPage:def __init__(self, page):self.page pageself.search_term_input page.get_by_role("searchbox", name"输入搜索词")def navigate(self):self.page.goto("https://bing.com")def searc…

探索远程访问内网群晖NAS 6.X(使用独立域名)【内网穿透】

使用自己的域名远程访问内网群晖NAS 6.X【内网穿透】 文章目录 使用自己的域名远程访问内网群晖NAS 6.X【内网穿透】 在之前的文章中&#xff0c;我们向大家演示了如何使用cpolar&#xff0c;创建一条固定的、能够在公共互联网登录内网群晖NAS的数据隧道。这条隧道已经能够应对…

ASEMI快恢复二极管APT80DQ20BG怎么检查好坏

编辑-Z 二极管APT80DQ20BG是一种高压快恢复二极管&#xff0c;常用于电源和电能质量控制等领域。如果您的二极管出现故障或需要进行维修&#xff0c;以下是一些可能的解决方案。 首先&#xff0c;确保您已经断开了电源&#xff0c;并且具备基本的电子维修知识和技能。如果您不…

Linux:shell脚本:基础使用(3)

for循环语句 语句格式 for for变量 in 取值列表&#xff08;可以是变量或者自己定义&#xff09; do 循环内容 done 工作方式就是通过取值列表去判断循环的次数&#xff0c;每次循环的同时把列表一行的值赋予到for变量。取值方式如果是数字&#xff0c;那就通过数字去…

neo4j查询语言Cypher详解(二)--Pattern和类型

Patterns 图形模式匹配是Cypher的核心。它是一种用于通过应用声明性模式从图中导航、描述和提取数据的机制。在MATCH子句中&#xff0c;可以使用图模式定义要搜索的数据和要返回的数据。图模式匹配也可以在不使用MATCH子句的情况下在EXISTS、COUNT和COLLECT子查询中使用。 图…

【计算机网络笔记】第一章

1、计算机网络定义 计算机网络主要是由一些通用的、可编程的硬件&#xff08;包含CPU、计算机、手机、智能电器…&#xff09;互连而成的&#xff0c;而这些硬件并非专门用来实现某一特定目的&#xff08;例如&#xff0c;传送数据或视频信号&#xff09;。这些可编程的硬件能…

机器学习深度学习——池化层

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——卷积的多输入多输出通道 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们…

【解决问题】手动执行maven命令安装指定jar包到本地仓库

背景&#xff1a; 有一个三方jar从远程仓库始终没有拉下来&#xff0c;没办法只能自己去下载&#xff0c;但是自己下载下来&#xff0c;不能直接建立个目录放到本地仓库&#xff0c;需要执行命令才行 操作 命令&#xff1a; mvn install:install-file -DgroupIdcom.alipay …

分享讨论学习IT上培训班有用吗?个人感悟

不知不觉一入行2年有余&#xff0c;回顾自己转行的学习历程&#xff0c;历历在目。我对培训机构好感度为0&#xff01; IT分行业发展未来&#xff0c;前景还是很好的&#xff0c;但是入门方向很重要&#xff0c;要选择什么方向去学学完才有钱景&#xff0c;需要自己 &#xff0…

在java集合HashMap中如何替换某一个键值

replace() 方法替换 hashMap 中是指定的 key 对应的 value。 replace() 方法的语法为&#xff1a; hashmap.replace(K key, V newValue) 或 hashmap.replace(K key, V oldValue, V newValue)示例代码如下&#xff08;把hashmap集合中的值为USA 的记录替换 成“US”&#xff0…

数据结构入门:队列

目录 文章目录 前言 1.队列 1.1 队列的概念及结构 1.2 队列的实现 1.2.1 队列的定义 1.2.2队列的初始化 1.2.3 入队 1.2.4 判空 1.2.5 出队 1.2.6 队头队尾数据 1.2.7 队列长度 1.2.8 队列销毁 总结 前言 队列&#xff0c;作为一种重要的数据结构&#xff0c;在计算机科学中扮演…

Metamask登录方式集成

Metamask登录 https://www.toptal.com/ethereum/one-click-login-flows-a-metamask-tutorial#how-the-login-flow-works 参考&#xff1a; https://zh.socialgekon.com/one-click-login-with-blockchain 后端需要在用户表中增加address和nonce字段。兼容其他登录方式&#xff0…

jstack 使用

.、用 ps -ef | grep -i java 命令&#xff0c;找出 Java|tomcat 进程 pid&#xff0c;用于查看全格式进程。 .、用 ps -aux | grep -i java 命令&#xff0c;找出 Java|tomcat 进程 pid&#xff0c;用于查看进程。.、用 top -Hp <pid> 命令&#xff0c;找出 CPU 占用最高…

基于低代码和数字孪生技术的电力运维平台设计

电力能源服务商在为用能企业提供线上服务的时候&#xff0c;不可避免要面对用能企业的各种个性化需求。如果这些需求和想法都要靠平台厂家研发人员来实现&#xff0c;那在周期、成本、效果上都将是无法满足服务运营需要的&#xff0c;这也是目前很多线上能源云平台应用效果不理…

第03天 String, StringBuffer, StringBuilder的区别

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

从三个主要需求市场分析,VR全景创业的潜力发展

VR全景&#xff0c;5G时代朝阳产业&#xff0c;其实拍摄制作很简单&#xff0c;就是利用一套专业的相机设备去给商家拍摄&#xff0c;结合后期专业的3DVR全景展示拍摄制作平台&#xff0c;打造3D立体环绕的效果&#xff0c;将线下商家真实环境1&#xff1a;1还原到线上&#xf…
最新文章