【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.mzph.cn/news/30722.shtml

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

相关文章

小研究 - MySQL 数据库下存储过程的综合运用研究

信息系统工程领域对数据安全的要求比较高&#xff0c;MySQL 数据库管理系统普遍应用于各种信息系统应用软件的开发之中&#xff0c;而角色与权限设计不仅关乎数据库中数据保密性的性能高低&#xff0c;也关系到用户使用数据库的最低要求。在对数据库的安全性进行设计时&#xf…

企业服务器器中了360后缀勒索病毒怎么解决,勒索病毒解密数据恢复

随着网络威胁的增加&#xff0c;企业服务器成为黑客攻击的目标之一。近期&#xff0c;上海某知名律师事务所的数据库遭到了360后缀的勒索病毒攻击&#xff0c;导致企业服务器内的数据库被360后缀勒索病毒加密。许多重要的数据被锁定无法正常读取&#xff0c;严重影响了企业的正…

adb 通过wifi连接手机

adb 通过wifi连接手机 1. 电脑通过USB线连接手机2. 手机开启USB调试模式&#xff0c;开启手机开发者模式3.手机开启USB调试模式 更多设置-》开发者选项-》USB调试4.点击Wi-Fi 高级设置&#xff0c;可以查看到手机Wi-Fi的IP地址&#xff0c;此IP地址adb命令后面的ip地址&#xf…

面试题:说说vue2的生命周期函数?说说vue3的生命周期函数?说说vue2和vue3的生命周期函数对比?

说说vue2的生命周期函数&#xff1f;说说vue3的生命周期函数&#xff1f;说说vue2和vue3的生命周期函数对比&#xff1f; 一、说说vue2的生命周期函数1.1 vue生命周期分为四个阶段、8个钩子1.1.1 beforeCreate 和 created 初始化阶段1.1.2 beforeMount 和 mounted 挂载阶段1.1.…

基于熵权法对Topsis模型的修正

由于层次分析法的最大缺点为&#xff1a;主观性太强&#xff0c;影响判断&#xff0c;对结果有很大影响&#xff0c;所以提出了熵权法修正。 变异程度方差/标准差。 如何度量信息量的大小&#xff1a; 把不可能的事情变成可能&#xff0c;这里面就有很多信息量。 概率越大&…

基于facenet+faiss开发构建人脸识别系统

facenet是一款非常经典的神经网络模型&#xff0c;它可以直接学习从人脸图像到欧几里德空间的映射(直接将人脸映射到欧几里得空间)。在欧几里德空间中&#xff0c;距离直接对应于人脸相似性的度量。一旦这个空间产生&#xff0c;使用标准技术&#xff0c;将FaceNet嵌入作为特征…

【Python机器学习】实验08 决策树

文章目录 决策树1 创建数据2 定义香农信息熵3 条件熵4 信息增益5 计算所有特征的信息增益&#xff0c;选择最优最大信息增益的特征返回6 利用ID3算法生成决策树7 利用数据构造一颗决策树Scikit-learn实例决策树分类决策树回归Scikit-learn 的决策树参数决策树调参 实验1 通过sk…

js2-js中的数据结构

1、什么是数据结构 数据结构是计算机存储、组织数据的方式。 数据结构意味着接口或封装&#xff0c;一个数据结构可被视为两个函数之间的接口&#xff0c;或者是由数据类型联合组成的存储内容的访问方法封装。 每天的编码中都会用到数据结构&#xff0c;其中数组是最简单的内存…

FFmpeg安装和使用

sudo apt install ffmpeg sudo apt-get install libavfilter-devcmakelist模板 CMakeLists.txt cmake_minimum_required(VERSION 3.16) project(ffmpeg_demo)# 设置ffmpeg依赖库及头文件所在目录&#xff0c;并存进指定变量 set(ffmpeg_libs_DIR /usr/lib/x86_64-linux-gnu) …

【GO】 33.go-zero 示例

1. 获取go-zero库 go get -u github.com/zeromicro/go-zero 2. 安装goctl brew install goctlgoctl -v #goctl version 1.5.4 darwin/amd64 3. 创建.api文件&#xff0c; greet.api goctl api -o greet.api syntax "v1"info (title: // TODO: add titledesc: //…

如何使用appuploader制作apple证书​

转载&#xff1a;如何使用appuploader制作apple证书​ 如何使用appuploader制作apple证书​ 一.证书管理​ 点击首页的证书管理 二.新建证书​ 点击“添加”&#xff0c;新建一个证书文件 免费账号制作证书只有7天有效期&#xff0c;没有推送消息功能&#xff0c;推送证书…

UNet Model

论文地址 第一阶段 conv2d(33) first conv&#xff1a;5725721 → 57057064 second conv&#xff1a;57057064 → 56856864 代码 # first 33 convolutional layer self.first nn.Conv2d(in_channels, out_channels, kernel_size3, padding1) self.act1 nn.ReLU() # Seco…

浏览器无法连接网络问题

问题描述 电脑其他程序都能正常联网&#xff0c;但是所有的浏览器都无法联网&#xff0c;同时外部网站都能ping通 问题诊断 查看电脑Internet连接的问题报告显示&#xff1a;该设备或资源(Web 代理)未设置为接受端口"7890"上的连接。 解决方案 经过检查发现不是IP地址…

若依vue -【 100 ~ 更 】

100 主子表代码生成详解 1 新建数据库表结构&#xff08;主子表&#xff09; -- ---------------------------- -- 客户表 -- ---------------------------- drop table if exists sys_customer; create table sys_customer (customer_id bigint(20) not null…

浅谈AI浪潮下的视频大数据发展趋势与应用

视频大数据的发展趋势是多样化和个性化的。随着科技的不断进步&#xff0c;人们对于视频内容的需求也在不断变化。从传统的电视节目到现在的短视频、直播、VR等多种形式&#xff0c;视频内容已经不再是单一的娱乐方式&#xff0c;更是涉及到教育、医疗、商业等各个领域。 为了满…

crypto-js中AES的加解密封装

在项目中安装依赖&#xff1a; npm i crypto-js在使用的页面引入&#xff1a; import CryptoJS from crypto-jscrypto-js中AES的加解密简单的封装了一下&#xff1a; //加密const KEY 000102030405060708090a0b0c0d0e0f // 秘钥 这两个需要和后端统一const IV 8a8c8fd8fe3…

API HOOK技术在MFC程序破解过程中的应用

更新&#xff0c;修改了一下typora的上传脚本&#xff0c;把图片全部上传到看雪上了 本文已于2023-08-02首发于个人博客 图片加载不出来&#xff0c;放了一个PDF版本在附件里 文中有几张图片是动图&#xff0c;如果不会动&#xff0c;可以去我的个人博客看 最近破解了一个M…

你不知道的阴影

我们在开发的时候&#xff0c;使用box-shadow添加阴影是这样的&#xff1a; .img {width: 500px;height: 500px;display: block;box-shadow: 0 0 15px #333333;} 但是我们想给这个图片加阴影应该怎么加那&#xff08;让UI做&#xff0c;我真聪明&#xff01;&#xff09; &…

Kali Hyper-V安装正常启动后 黑屏 只能进命令模式

问题: Hyper-V安装虚拟机Kali系统一切安装正常, 没有出现错误. 安装成功后重启,只能进入命令模式,tt1-tt6,进不去GUI桌面. 尝试: 一代二代虚拟硬盘都试过,同样问题,只能开进后进入命令模式,在命令模式下一切运行正常, 也修复过系统 GNOM等的,不管用. 以下为国外论坛给的建议,尝…

Centos7单机部署ElasticSearch

Centos7单机部署ElasticSearch 引言 Elasticsearch是一种广泛使用的开源搜索引擎&#xff0c;专门为分布式环境设计&#xff0c;但也可以在单机上运行。它使存储、搜索和分析大量数据变得更加容易和高效。此教程将引导你通过在Centos7上单机部署Elasticsearch&#xff0c;涵盖…