首页 > 其他分享 >GNU编译器(GCC)原理简介

GNU编译器(GCC)原理简介

时间:2024-10-26 18:20:35浏览次数:7  
标签:文件 GCC GNU C++ 编译 编译器

GNU编译器(GCC)原理简介    GNU编译器(GCC, GNU Compiler Collection)是GNU工具链的关键组件,与GNU、Linux相关项目的标准编译器。它设计之初仅用来处理C语言的(也被称为GNU C编译器),紧接着扩展到C++、Objective-C/C++、Fortran、Java、Go等编程语言。 目前,GCC已经被以知道各种指令集体系结构中,成为了自由软件、专有软件的开发工具。GCC编译器可以应用多种平台:操作系统(Linux/Windows)、移动端(Android/iSO)、嵌入式系统(Arm/FPGA)等。  1. GNU编译器(GCC)的编译过程 如图2-32所示,GCC的编译工程可以分为四个步骤: 1)预处理(Pre-Processing):使用CPP对C语言源程序进行预处理生成预处理.i文件,在该过程主要对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析; 2)编译(Compiling):调用CC1将预处理后的.i文件编译汇编语言.s文件,这个阶段主要是对预处理文件进行转换以生成机器语言的目标程序; 3)汇编(Assembling):GCC调用AS对汇编语言.s文件进行汇编,生成目标文件.o; 4)链接(Linking):GCC调用LD将各个模块的.o文件连接起来生成一个可执行程序文件,该过程将目标文件/库文件指派到可执行程序各自对应的位置。 图2-32 GNU编译器(GCC)的编译过程 GCC编译过程中,每个步骤都会生成不同的文件格式,C/C++在编译过程中生成的文件类型,见表2-18。 表2-18 列举了C/C++在编译过程中生成的文件类型

文件后缀

描述

.c

C语言源文件

.C/.cc/.cxx/.cpp

C++ 源文件

.h

C/C++ 头文件

.i/.ii

经过预处理的 C/C++ 文件

.s/.S

汇编语言源文件

.o/.obj

静态库

.so/.dll

动态库

  可以根据自己的需要控制GCC的编译过程和中间文件,以便检查、调试和优化程序。如图2-33所示,给出了C语言随着编译过程生成的文件类型。   图2-33 C语言随着编译过程生成的文件类型  2. GNU编译器(GCC)的使用方法 GCC的基本用法如下所示,使用GCC编译器需要关注两个方面:调用参数(操作方法)和文件名称(操作对象),见表2-19。 表2-19 列举了C/C++在编译过程中生成的文件类型

命令

作用

-c

只进行编译过程,而不链接成可执行文件,编译器只是将输入的源代码

-g

生成符号调试工具(GNU的gdb)所需要的符号信息。

-E

仅执行预处理操作,而不进行编译、汇编和链接操作

-S

仅执行编译操作,而不进行汇编、链接操作

-O

对程序进行优化编译、链接操作,提高可执行文件的执行效率

-o file_name

设置输出文件名为file_name,注意输出文件名不能和源文件同名;如果不给出

GCC的外部结构遵循Unix约定,用户调用特定语言的驱动程序解释命令参数,生成完整的可执行二进制文件。 每种编程语言的编译器都是一个单独的程序,读取源代码并输出机器码;每种编程语言的前端都会解析该语言的源代码,最终生成一个抽象的语法树。  3. GNU编译器(GCC)手册使用方法 在Linux系统上,可以查看GCC的手册。在终端输入man gcc,即可打开,如图2-34所示。 图2-34 可以查看GCC的手册 手册中给出的介绍比任何资料都详细准确,但是非常的长1.6万行。快速浏览手册的快捷键与vim很相似,见表2-20。 表2-20 快速浏览手册的快捷键与vim很相似

快捷键

作用

g/G

跳转到文档顶/底部

u/d

向上(up)/下(down)翻动半页

f/b

向上(forward)/下(backward)翻动一页

/

在文档中搜索内容,按下/在后面输入想要查询的内容

n/N

跳转到下/上一个搜索的内容

q

退出手册

                       

标签:文件,GCC,GNU,C++,编译,编译器
From: https://www.cnblogs.com/wujianming-110117/p/18504312

相关文章

  • 编译器 help-assignment
    Bison是一款LALR文法解析器生成器,可转换为可编译的C代码,减轻手动设计解析器的工作。它重新实现了早期Unix上的Yacc工具,文件扩展名为 .y(Yacc意为YetAnotherCompilerCompiler)。Flex和Bison是Linux下生成词法分析器和语法分析器的工具,用于处理结构化输入,协同......
  • Ubutun18.04安装UHD+GNURadio,使用usrpB210
     安装Ubutun省略。首先,进入ubutun18.04桌面后,ctrl+alt+T进入终端,然后:更新源列表、安装各种工具及依赖库,更新源列表与已安装软件、安装常用工具:sudoaptupdatesudoaptupgradesudoaptinstallnet-toolsvimsshgitgit-guihtop安装后来cmake时需要用到的一些依赖......
  • 在华为云服务器上测试GCC for OpenEuler的特性
    步骤1:购买并配置华为云服务器1.1注册华为云账号访问华为云官网:打开浏览器,访问华为云官网。注册账号:点击页面右上角的“注册”按钮。按照提示填写必要的信息(邮箱、密码、验证码等)完成注册。可能需要验证邮箱,请按照邮件中的指示完成验证。1.2登录华为云控制台登录......
  • 用C++构建自己的编译器:从词法分析到代码生成
    解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界本文将带领读者从零开始构建一个简单的C++编译器。我们将逐步讲解如何进行词法分析、语法分析,以及如何将这些结果转换为目标代码。这篇文章的目标是帮助读者理解编译器的基本构成和工作原理,并提供可扩展的编译器......
  • GNU链接器(LD):使用链接脚本符号统计存储器使用率
    0参考资料GNU-LD-v2.30-中文手册.pdfGNUlinker.pdf1前言一个完整的编译工具链应该包含以下4个部分:(1)编译器(2)汇编器(3)链接器(4)lib库在GNU工具链中,对应的是:(1)编译器:GCC(GNUCompilerCollection,GNU编译器套件)(2)汇编器:GAS(GNUAssembler,GNU汇编器)(3)链接器:LD(GNULinker,G......
  • 嵌入式Linux编程基础 | GCC 静、动态函数库的创建与链接方法
    一、静态库与动态库的区别库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so表示一个命名为libhello的动态库,libhello.a则是一个命名为libhello的静态库。当使用静态库时,连接器找出程序所需的函数,并将其拷贝到可执行文件,一旦链接成功,静态程序库......
  • AOT漫谈专题(第五篇): 如何劫持.NET AOT编译器 进行源码级调试
    一:背景1.讲故事上篇聊到了C#程序编译成Native代码的宏观过程,有粉丝朋友提了一个问题,能不能在dotnetpublish发布的过程中对AOT编译器拦截进行源码级调试,这是一个好问题,也是深度研究的必经之路,这篇我们就来分享下吧。二:托管和非托管调试器1.调试器介绍相信大家现在都知......
  • OS-Lab2-Linux进程控制相关命令和系统调用(含gcc编程)
    实验目的1) 概念:Linux的gcc编译器2) 演示/实践:gcc编译器的初步和入门(编写一个带printf的while程序)3) 演示/实践:Linux进程控制相关的命令(如ps/pstree/top/kill/等)演示/实践:Linux进程控制相关的系统调用(如fork()/getpid()等)4) 概念:Linux的gdb调试器5) 概念:Linux的make工具及其Makefi......
  • 三大编译器
    编译器的一般构成三个部分:前端(frontEnd)+优化器(Optimizer)+后端(backEnd)前端:词法和语法分析优化器:承前基础+优化代码=更加高效后端:将中间代码转化为各个平台的机器代码!GCC可以处理C++FortranPascalObjective-CJavaAda等LLVM(LowLevelV......
  • gcc g++ 的区别
    GNUgccg++的区别GNU(GNUCompilercollection)是编译工具集,而g++(GNUc++compiler),gcc(GNUccompiler)从属于GNU;g++,gcc不是真的编译c/c++程序,而是调用GNU中的编译器;GNU包括:编译器,链接器,组装器等;gcc,g++最好只用来分别编译c/c++,别混用;gcc>g++原因在于gcc可......