在Linux上写过C并且编译过的同学想必一定要和GCC打交道,可能刚接触的同学只知道GCC是一款编译工具。其实GCC发展至今并不是一开始作者就想把GCC打造成如今一统江山的一个工具,而是给他的另一个宏伟计划的一个配套,所谓有心插花花不活,无心插柳柳成荫。
上面的宏伟计划就是GNU,GNU's Not UNIX,由理查德·斯托曼于 1983 年发起。GNU 计划的最终目标是打造出一套完全自由(即自由使用、自由更改、自由发布)、开源的操作系统,并初步将其命名为 GNU 操作系统。GNU有个响亮的中文名:革奴计划,其logo是一头非洲牛羚。
GNU 计划提出之初的发展并不是一帆风顺,虽然该计划为 GNU 操作系统量身定做了名为 Thr Hurd 的系统内核,但由于其性能比不上同时期诞生的 Linux 内核,最终 GNU 计划放弃 The Hurd 而选用 Linux 作为 GNU 操作系统的内核。在 Linux 内核的基础上,GNU 计划开发了很多系统部件,GCC 就是其中之一。
早期 GCC 的全拼为 GNU C Compiler,即 GUN 计划诞生的 C 语言编译器,显然最初 GCC 的定位确实只用于编译 C 语言。但经过这些年不断的迭代,GCC 的功能得到了很大的扩展,它不仅可以用来编译 C 语言程序,还可以处理 C++、Go、Objective -C 等多种编译语言编写的程序。与此同时,由于之前的 GNU C Compiler 已经无法完美诠释 GCC 的含义,所以其英文全称被重新定义为 GNU Compiler Collection,即 GNU 编译器套件。
GCC 编译器从而停止过改进。截止到今日(2023 年11 月),GCC 已经从最初的 1.0 版本发展到了 13.2版本,期间历经了上百个版本的迭代。作为一款最受欢迎的编译器,GCC 被移植到数以千计的硬件/软件平台上
GCC Releases- GNU Project
我们本次以Centos7为平台,演示如何安装GCC。
首先我们配置好yum源,可以配成国内的镜像,默认的Centos源是官方的源,可能也能用就是很慢。
然后直接傻瓜式的命令安装
yum -y install gcc
yum -y install gcc-c++
执行以上两条安装命令,就可以在 CentOS 系统中利用 gcc 命令来执行 C 语言程序,利用 g++ 命令来执行 C++ 程序。需要注意的是切勿认为 gcc 只能用来编译 C 语言程序,g++ 只能用于编译 C++ 程序,这是不对的。
这种傻瓜式的安装固然很方便,但是经历过的同学都知道这样安装的版本一般都非常低,就以我的Centos7为例,默认安装的版本是4.8.5,对于没有高版本特性或者需要使用特定版本GCC的同学而言,4.8.5是够用的。
但是如果需要高版本或者特定版本的同学就需要手动安装了。和使用 yum 自动安装 GCC 编译器不同,手动安装 GCC 编译器需要提前到 GCC 官网下载指定版本的 GCC 源码安装包,读者可直接点击GCC源码包进行下载。值得一提的是,每个版本中都包含 2 种格式的压缩包,分别为 tar.gz 和 tar.xz,只是压缩格式不同,本节以 tar.gz 压缩包教大家安装 GCC 编译器。
1>本地先安装一个GCC(用于源码编译),如果本地有可以跳过
yum install -y glibc-static libstdc++-static
yum install -y gcc gcc-c++
第一行指令用于安装编译 C 和 C++ 代码所需的静态链接库;第二行指令用于安装编译 C 和 C++ 代码的 gcc 和 g++ 指令。
2>下载GCC安装包
将下载好的 gcc-10.1.0.tar.gz 安装包,将其解压至 /usr/local/ 目录下
tar -xf gcc-10.1.0.tar.gz -C /usr/local/
3>下载安装 GCC 所需要的依赖包
cd /usr/local/gcc-10.1.0
./contrib/download_prerequisites
注意,一定观察此命令的执行结果,保证其确实是将 gmp、mpfr、mpc 等依赖包成功下载下来,才能继续执行下面的安装步骤。
4>编译前的准备工作
手动创建一个目录,用于存放编译 GCC 源码包生成的文件
mkdir gcc-build-10.1.0
cd gcc-build-10.1.0
我们在 /usr/local 目录下手动创建了名为 gcc-build-10.1.0 的目录文件,并进入到该目录中。
由于 GCC 编译器支持多种编程语言的编译,而实际情况中我们可能只需要编译 1~2 种编程语言,因此需要对其进行必要的配置。通过执行如下指令,可以配置 GCC 支持编译 C 和 C++ 语言:
../gcc-10.1.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
--enable-languages 用于设定 GCC 编译器支持编译的编程语言的类别,例如 c、c++、java、objc、obj-c++、go 等。
5>编译GCC
make
注意,编译过程是非常耗时的,因此如果读者选用此方式安装 GCC,则在执行 make 命令时一定要安排合适的时间。
6>安装GCC
make install
执行完之后需要重启Linux
reboot
-o outfile:指定输出文件名
-E:仅对源文件进行预处理,不进行编译,如果未指定-o选项则结果输出到标准输出
-S:对源文件进行预处理、编译,不进行汇编,如果未指定-o选项则结果保存到与.c文件同名的.s文件
-c:对源文件进行预处理、编译和汇编,不进行链接,如果未指定-o选项则结果保存到与.c文件同名的.o文件
-std=standard:指定语言标准版本
-D name[=definition]:预定义宏,如果省略定义则默认为1
-Wall:打开所有编译警告
-Werror:将所有警告当成错误
-Idir:将指定路径添加到头文件搜索路径列表
-Ldir:将指定路径添加到库文件搜索路径列表
-lxxx:手动指定函数库xxx参与链接
GCC编译优化:
gcc编译优化选项支持五种,分别是-O0、-O1、-O2、-Os和-O3。
-O0表示无优化,是默认选项。
-O1和-O2选项可以对程序进行部分编译优化,其中-O1选项尝试减小目标文件大小和缩短执行时间,而不显著增加编译时间;-O2选项增加了更多的优化选项,包括循环展开、内联函数等,会提高程序的执行性能。
-Os选项专门针对目标文件大小进行优化,执行所有不增加目标文件大小的-O2优化选项,并执行专门减小目标文件大小的优化选项。
-O3选项打开所有-O2的优化选项,并增加了循环展开、函数内联等更多的优化选项,以提高程序执行性能。
此外,还可以使用-fdefer-pop选项来延迟栈的弹出时间,以提高函数的调用速度。