Linux环境下GCC基本使用详解(含实例)

您所在的位置:网站首页 如何用命令修改电脑的资产编码呢 Linux环境下GCC基本使用详解(含实例)

Linux环境下GCC基本使用详解(含实例)

2024-07-05 22:49| 来源: 网络整理| 查看: 265

文章目录 一、GCC概述二、安装GCC三、gcc基本命令四、gcc编译C语言过程示例Step1:预处理Step2:编译Step3:汇编Step4:链接 参考资料

一、GCC概述

GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。 GCC 原名为 GNU C语言编译器,因为它原本只能处理 C 语言,但如今的 GCC ,不仅可以编译 C、C++ 和 Objective-C,还可以通过不同的前端模块支持各种语言,包括 Java、Fortran、Ada、Pascal、Go 和 D 语言等等。 GCC支持多种硬件开发平台,还能进行跨平台交叉编译。此外,GCC是按模块化设计的,可以加入新语言和新CPU架构的支持。

GCC、gcc、g++三者之间的关系 gcc(GUN C Compiler)是GCC中的c编译器,而g++(GUN C++ Compiler)是GCC中的c++编译器。 gcc和g++两者都可以编译c和cpp文件,但存在差异。gcc在编译cpp时语法按照c来编译但默认不能链接到c++的库(gcc默认链接c库,g++默认链接c++库)。g++编译.c和.cpp文件都统一按cpp的语法规则来编译。所以一般编译c用gcc,编译c++用g++。

二、安装GCC

GCC 编译器是 Linux 下默认的 C/C++ 编译器,大部分 Linux 发行版中都是默认安装的。若需要安装,在终端中执行以下命令安装GCC:

sudo apt install build-essential

GCC 编译器通常以 Linux 命令的形式在终端(Shell)中使用。安装后可使用以下命令查看GCC版本信息:

gcc --version

在这里插入图片描述

如果需要其他特定的GCC组件,例如C++编译器(g++)或Fortran编译器(gfortran),您可以使用以下命令进行安装: 安装g++:

sudo apt install g++

安装gfortran:

sudo apt install gfortran 三、gcc基本命令

gcc的基本语法是:

gcc [options] [filenames]

其中[options]表示参数,[filenames]表示相关文件的名称。 一些常用的参数及含义下表所示:

参数名称含义-E仅执行预处理,不进行编译、汇编和链接(生成后缀为 .i 的预编译文件)-S执行编译后停止,不进行汇编和链接(生成后缀为 .s 的预编译文件)-c编译程序,但不链接成为可执行文件(生成后缀为 .o 的文件)-o直接生成可执行文件-O/-O1/-O2/-O3优化代码,减少代码体积,提高代码效率,但是相应的会增加编译的时间-Os优化代码体积(多个-O参数默认最后一个)-Og代码优化(不能与“-O”一起用)-O0关闭优化-l [lib](这里是小写的L,命令无中括号,下同)指定程序要链接的库,[lib]为库文件名称。如果gcc编译选项中加入了“-static”表示寻找静态库文件-L [dir]指定-l(小写-L)所使用到的库文件所在路径-I [dir](这里是大写的I)增加 include 头文件路径-D [define]预定义宏-static链接静态库生成目标文件,禁止使用动态库(在支持动态链接的系统上)-share尽量使用动态库,但前提是系统存在动态库,生成的目标文件较小-shared生成共享文件,然后可以与其它文件链接生成可执行文件-fpic生成适用于共享库的与地址无关的代码(PIC)(如果机器支持的话)-fPIC生成与位置无关的的代码,适用于使用动态库,与“-fpic”的区别在于去除去全局偏移表的任何限制(如果机器支持的话)-fPIE使用与地址无关的代码生成可执行文件-w不输出任何警告信息-Wall开启编译器的所有警告选项-g生成调试信息,方便gdb调试-v查看gcc编译器的版本,显示gcc执行时的详细过程-ggdb加入GDB调试器能识别的格式-Werror将所有的警告当成错误进行处理,在所有产生警告的地方停止编译-M生成适合于make规则的主要文件的依赖信息-MM与“-M”相比忽略由“#include”所造成的依赖-MD与-M作用类似,将输出导入到 .d 文件中-MMD与-MM作用类似,将输出导入到 .d 文件中–help查看帮助信息(注意前面是两个“-”,一个“-”不行)–version查看版本信息(注意前面是两个“-”,一个“-”不行) 四、gcc编译C语言过程示例

首先创建一个hello.c文件作为实例

在这里插入图片描述 要编译这个程序,只要在命令行下执行如下命令:

gcc hello.c -o hello ./hello

这样,gcc 编译器会生成一个名为hello的可执行文件,然后执行./hello就可以看到程序的输出结果了。

箭头所指处为生成的可执行文件 命令行中 gcc表示用gcc来编译源程序,hello.c是源程序文件,-o hello选项表示要求编译器输出的可执行文件名为hello。从程序员的角度看,只需简单地执行一条gcc命令就可以了;但从编译器的角度来看,却需要完成一系列非常繁杂的工作。首先,gcc需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入#include语句所包含的内容;接着,gcc会调用ccl和as将处理后的源代码编译成目标代码;最后,gcc会调用链接程序ld,把生成的目标代码链接成一个可执行程序。

在这里插入图片描述

为了更好地体现gcc的工作过程,可以把上述编译过程分成预处理(Pre-Processing)、编译(Compiling)、汇编(Assembling)、链接(Linking) 四个步骤单独进行,并观察每步的运行结果。

Step1:预处理

预处理通过对宏定义(像#define)进行展开,对头文件(像 stdio.h)进行展开,对条件进行(像ifdef)编译,展开所有宏,删除所有注释(像"//")。预处理cpp把源代码以及头文件预编成一个.i文件。命令如下:

gcc -E hello.c -o hello.i

gcc的-E参数,可以让编译器在预编译后停止,并输出预编译结果(hello.i文件)。

在这里插入图片描述

此时若查看hello.i文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而且被预处理的宏定义也都作了相应的处理。

在这里插入图片描述

注意:这时并不检查语法,所以即使有语法错误也不会报错。

Step2:编译

编译也就是检查语法是否错误,将预处理过的文件编译成汇编(.s)文件。命令如下:

gcc -S hello.i -o hello.s

在这里插入图片描述

在这里插入图片描述

Step3:汇编

汇编也就是将汇编(.s)文件生成目标文件(二进制文件)。通过汇编,文本代码变成了二进制代码(二进制代码文件以.o为后缀名)。命令如下:

gcc -c hello.s -o hello.o

在这里插入图片描述 打开hello.o文件,是一堆乱码,因为.o文件为二进制文件。

在这里插入图片描述

Step4:链接

链接过程就是找到依赖的库文件(静态与动态),将目标文件链接为可执行程序。命令如下:

gcc [目标文件] -o [可执行程序] -l[动态库名]

假如没有动态库的话,直接使用以下命令:

gcc [目标文件] -o [可执行程序]

对于本例,则输入命令如下:

gcc hello.o -o hello

在这里插入图片描述

GCC官网地址:https://gcc.gnu.org/ GCC官网入口

参考资料

[1] Using the GNU Compiler Collection (For gcc version 13.2.0) 文档链接 [2] 正点原子启明星ZYNQ之嵌入式Linux开发指南_V2.1 [3] gcc 命令详解及最佳实践 网页链接 [4] gcc 的使用 网页链接 [5] 浅显易懂的GCC使用教程——初级篇 网页链接 [6] gcc基本操作(带例子)网页链接 [7] Linux下 gcc 的使用(一看就会系列)网页链接



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3