【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,一经查实,立即删除!

相关文章

Kubernetes 之 Kubeadm 搭建

Kubeadm 搭建 一、搭建准备1.1 环境准备1.2 所有节点安装docker1.3 所有主机安装 cri-dockerd1.4 所有节点安装kubeadm&#xff0c;kubelet和kubectl1.5 部署K8S集群1.6 设定kubectl1.7 部署 Dashboard 一、搭建准备 master&#xff08;2C/4G&#xff0c;cpu核心数要求大于2&a…

小研究 - 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.…

三个整数排序

描述 给定三个整数&#xff0c;请将它们按从小到大的顺序输出。 输入 输入为一行&#xff0c;包含三个整数&#xff0c;用空格分隔。 输出 输出为一行&#xff0c;包含三个整数&#xff0c;用空格分隔&#xff0c;表示排序后的结果。 输入样例 1 9 3 7 输出样例 1 3 …

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

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

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

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

二、 根据用户行为数据创建ALS模型并召回商品

二 根据用户行为数据创建ALS模型并召回商品 2.0 用户行为数据拆分 方便练习可以对数据做拆分处理 pandas的数据分批读取 chunk 厚厚的一块 相当大的数量或部分 import pandas as pd reader pd.read_csv(behavior_log.csv,chunksize100,iteratorTrue) count 0; for chunk in …

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

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

双网卡单独设置内外网教程

# -p add 表示永久 #打印所有的路由 route print 先删除所有的路由信息 route delete 0.0.0.0 #先所有的走无线网络 2表示优先级&#xff0c;数字越小表示优先级越靠前 #假设10.98.40.7是上外网的网关。如果上不了网&#xff0c;请重新禁用网卡然后启动一下 route –p add 0…

gen_image1

算子gen_image1创建一个Width*Height大小的图像。 PixelPointer中的像素按线顺序存储。 给定像素的类型&#xff08;PixelPointer&#xff09;必须对应于Type&#xff08;请参阅gen_image_const以获取更详细的像素类型描述&#xff09;。 新图像的存储是由HALCON新创建的。 因此…

vue3 基础响应式和传值问题

1.ref reactive 需要响应式的情况下&#xff0c;使用ref reactive&#xff08;proxy&#xff09; &#xff08;1&#xff09; 基本数据类型一般用ref &#xff0c;例如数字、布尔、字符串&#xff0c;利用.value调用 &#xff08;2&#xff09; reactive 的值必须是引用类型的…

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) …

MySQL到Oracle快速上手

第一次做Oracle项目的时候对一些语法区别不太清楚&#xff0c;这里列出一些开发中发现的与MYSQL不同的点 一个用户相当于一个数据库 表空间 表空间是用于存储表、索引和其他数据库对象的逻辑存储结构。每个表空间由一个或多个数据文件组成&#xff0c;这些文件可以位于不同的物…

SpringBoot下使用自定义监听事件

事件机制是Spring的一个功能&#xff0c;目前我们使用了SpringBoot框架&#xff0c;所以记录下事件机制在SpringBoot框架下的使用&#xff0c;同时实现异步处理。事件机制其实就是使用了观察者模式(发布-订阅模式)。 Spring的事件机制经过如下流程&#xff1a; 1、自定义事件…

Ventoy 设置VTOY_MAX_SEARCH_LEVEL = 0只扫描U盘根目录 不扫码子目录

在镜像分区/media/yeqiang/Ventoy创建目录ventory&#xff0c;目录内创建文件ventoy.json&#xff0c;内容如下 {"control":[{ "VTOY_MAX_SEARCH_LEVEL": "0" }] }采用系统默认的utf-8编码。 参考&#xff1a; search path . Ventoy Plugin.e…

2023河南萌新联赛第(五)场:郑州轻工业大学 I - 双指针

2023河南萌新联赛第&#xff08;五&#xff09;场&#xff1a;郑州轻工业大学 I - 双指针 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 给定一个数组 a a a 和数组 b …

【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: //…