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

news2024/10/6 2:26:17

目录

一,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.coloradmin.cn/o/860859.html

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

相关文章

预测性维护如何改变设备管理部门的工作方式?

在现代工业中&#xff0c;设备管理部门面临着日益复杂的挑战。维护工作的准确性和高效性变得愈发重要&#xff0c;特别是在资产技术日益复杂的背景下。预测性维护&#xff08;PdM&#xff09;作为一种革命性的方法&#xff0c;通过实时评估运营数据并利用人工智能&#xff08;A…

Android Studio 拉取代码后 git显示大量文件被修改

参考&#xff1a; 在 Git 中正确设置 CRLF、LF 换行符转换 现象 拉取后再Android Studio 中显示正常&#xff0c;但是 run 之后&#xff0c;所有的文件在git 中显示 modify。 查看具体变更发现是所有的内容先显示删除 - &#xff0c;在显示添加 Beyond Compare 文本比较显…

Visdom安装避坑

VIsdom&#xff0c;与tensorboard作用类似 通过以下命令安装Visdom&#xff0c; pip install visdom 启动visdom服务 python -m visdom.server 运行一直卡在Downloading scripts, this may take a little while&#xff0c;某些资源因为网络问题难以下载&#xff0c;导致一…

利用SCCM进行横向移动

01SCCM介绍 SCCM全名为System Center Configuration Manager&#xff0c;从版本1910开始&#xff0c;微软官方将其从Microsoft System Center产品移除&#xff0c;重新命名为Microsoft Endpoint Configuration Manager&#xff08;ConfigMgr&#xff09;&#xff0c;其可帮助 …

W6100-EVB-PICO 做TCP Server进行回环测试(六)

前言 上一章我们用W6100-EVB-PICO开发板做TCP 客户端连接服务器进行数据回环测试&#xff0c;那么本章将用开发板做TCP服务器来进行数据回环测试。 TCP是什么&#xff1f;什么是TCP Server&#xff1f;能干什么&#xff1f; TCP (Transmission Control Protocol) 是一种面向连…

实现分布式事务:Java与MySQL的XA事务协调

目录 一、什么是XA事务 二、Java中的XA事务支持 三、MySQL的XA事务协调 四、注意事项和最佳实践 五、基于 java 语言的开发工具 六、小结 分布式事务是在跨多个数据库或服务之间保持一致性的重要机制。Java与MySQL的XA&#xff08;eXtended Architecture&#xff09;事务…

获取接口的所有实现

一、获取接口所有实现类 方法1&#xff1a;JDK自带的ServiceLoader实现 ServiceLoader是JDK自带的一个类加载器&#xff0c;位于java.util包当中&#xff0c;作为 A simple service-provider loading facility。 &#xff08;1&#xff09;创建接口 package com.example.dem…

Lua 数据类型 —— 字符串

一、字符串 Lua 使用 八个比特位来存储 字符。&#xff08;一个字节 八个比特位&#xff09; Lua 最好使用 UTF-8 编码。 字符串是不可变值&#xff0c;和 java 和 kotlin 相似&#xff0c;修改其中某一个字符&#xff0c;都是创建一个新的字符串。 Lua 对字符串会进行自动…

Python进阶(二)

前言&#xff1a;本篇博客主要记录Python进程的创建、进程间的通信、进程池的使用、线程的创建、多线程的执行、同步和互斥、协程的创建和应用。 目录 思维导图 基本概念 进程 进程的创建 进程间的通信 进程池 线程 线程的创建 子线程的执行顺序 同步&互斥 互斥…

惊讶,日本用“Excel”作画,中国却用“Excel”造“另类”软件

精益求精 表格是一项伟大的创造&#xff0c;它的出现改变了人类记录、分析和展示数据的方式。 随着科技的日益月异的更新&#xff0c;从最早的纸质表格到现代化的电子表格&#xff0c;人类对表格的改造也在不断的升级和进步。 最初的纸质表格的简单记录&#xff0c;无法进行复…

企业权限管理(八)-登陆使用数据库认证

Spring Security 使用数据库认证 在 Spring Security 中如果想要使用数据进行认证操作&#xff0c;有很多种操作方式&#xff0c;这里我们介绍使用 UserDetails 、 UserDetailsService来完成操作。 UserDetails public interface UserDetails extends Serializable { Collecti…

汇聚行业精英,共探创新之道:首届NDI生态系统行业峰会即将登陆北京!

IP化和轻量化是媒体制播技术发展的主要趋势。为了推进媒体行业的IP制播技术应用发展&#xff0c;提供一个专业、全面的媒体技术交流平台&#xff0c;长沙千视电子科技有限公司将联合NDI官方、NDI生态产品厂家和NDI技术应用媒体单位于2023年8月22日在北京举办国内首届NDI生态系统…

嵌入式开发学习(STC51-11-中断系统)

内容 外部中断-使用独立按键K3控制LED亮灭&#xff1b; 定时器&#xff08;中断&#xff09;-通过定时器0中断控制D1指示灯间隔1秒闪烁&#xff1b; 串口通信&#xff08;中断&#xff09;-通过串口&#xff08;UART&#xff09;实现与PC机对话&#xff0c;51单片机的串口收…

Leetcode算法递归类—合并两个有序链表

目录 21. 合并两个有序链表 题解&#xff1a; 代码&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&a…

logstash 采集 docker 日志

1、nginx容器部署 参考&#xff1a;nginx容器部署 将容器内的nginx日志文件映射到宿主机/home/logs/nginx目录下 注意&#xff1a;并且需要需要将日志的输出格式修改为json 2、编辑vim /opt/logstash-7.4.2/config/nginx-log-es.conf 文件&#xff0c;收集docker nginx容器日…

【时间格式引发的事故】

时间格式引发的事故 背景实战演示结论 背景 前不久写了一个删除数据接口&#xff0c;条件是根据时间删除时间后面的数据。入参是 时间字符串。后台的时间格式 是 yyyyMMdd。然后当时前端传参数的时候&#xff0c;随意的传了2023-07-31的时间&#xff0c;然后将该表的数据全部删…

CCLINK IE转MODBUS-TCP网关modbus tcp协议详解

你是否曾经遇到过需要同时处理CCLINK IE FIELD BASIC和MODBUS两种数据协议的情况&#xff1f;捷米的JM-CCLKIE-TCP网关可以帮助你解决这个问题。 捷米JM-CCLKIE-TCP网关可以分别从CCLINK IE FIELD BASIC一侧和MODBUS一侧读写数据&#xff0c;然后将数据存入各自的缓冲区。接着…

【学习】若依源码(前后端分离版)之 “ 用户管理根据不同角色、部门显示数据范围”

大型纪录片&#xff1a;学习若依源码&#xff08;前后端分离版&#xff09;之 “ 用户管理根据不同角色、部门显示数据范围” 前端部分后端部分“ /list " 方法" /treeselect " 方法 结语 起因是我想做一个根据不同角色以及其所在的部门展示其相应的信息&#x…

StarRocks 3.1重磅发布,云原生湖仓新范式再升级!

StarRocks 自4月底发布3.0版本&#xff0c;拥抱云原生&#xff0c;开启极速统一的湖仓新范式&#xff1b;8月7日&#xff0c;StarRocks 正式发布全新3.1版本&#xff0c;全面提升云原生存算分离构架、极速数据湖分析、物化视图等重量级特性&#xff0c;让用户更简单的实现极速统…

前端性能优化之性能优化的指标和工具(chrome devtools、lighthouse、webpagetest)

文章目录 引言一、为什么要进行web性能优化二、RAIL测量模型1. 什么是RAIL2. 性能测量工具 三、性能测量工具的使用和性能指标以及优化目标1. Chrome DevTools1. 打开调试工具方式和配置2. network下的几个性能指标1. requests 请求总数2. transferred实际从服务器下载的数据量…