GNU GCC 编译器介绍和安装

以下内容可以参考 GCC 官网,官方有更全的介绍和使用方法。

1. 什么是 GCC?

早期 GCC 的全拼为 GNU C Compiler,即 GUN 计划诞生的 C 语言编译器,显然最初 GCC 的定位确实只用于编译 C 语言。

经过这些年不断的迭代,GCC 的功能得到了很大的扩展,它不仅可以用来编译 C 语言程序,还可以处理 C++、Go、Objective -C 等多种编译语言编写的程序。与此同时,由于之前的 GNU C Compiler 已经无法完美诠释 GCC 的含义,所以其英文全称被重新定义为 GNU Compiler Collection,即 GNU 编译器套件。

GCC 编译器从未停止过改进。截止到 2020 年 5 月,GCC 已经从最初的 1.0 版本发展到了 10.1 版本,期间历经了上百个版本的迭代。作为一款最受欢迎的编译器,GCC 被移植到数以千计的硬件/软件平台上,几乎所有的 Linux 发行版也都默认安装有 GCC 编译器。


2. GCC 的直接安装

GCC 编译器在 Linux 系统中的安装非常简单,只需要一条命令即可完成安装:

sudo apt-get install gcc

GCC 编译器在 Windows 系统中的安装稍微复杂一些,需要先安装 MinGW,然后通过 MinGW 安装 GCC。

GCC 编译器在 Mac 系统中的安装也非常简单,只需要一条命令即可完成安装:

brew install gcc

3. GCC 源码安装

官方 GCC 源码安装文档,将安装步骤分成了五个部分:

  1. Prerequisites,先决条件
  2. Downloading the source
  3. Configuration
  4. Building
  5. [Testing (optional)]
  6. [Final install]

第 1 、2 步骤为下载步骤,这里不再赘述,主要介绍后面的配置安装步骤。

3.1 Configuration 配置

像大多数GNU软件一样,GCC 必须在构建之前进行配置,且已有一个可执行的 GCC 版本(故编译时,也可以为非本机系统编译 GCC)。如果您以前在同一目录中为不同的目标计算机构建了GCC,请执行 “make distclean” 以删除所有可能无效的文件。

在配置本机系统时,cc 或 gcc 必须位于路径中,或者必须在运行 configure 之前在环境中设置CC。否则,配置脚本可能会失败。

要配置GCC,请执行以下操作:

./configure --prefix=/usr/local/gcc-10.1.0  --host=x86_64-pc-linux-gnu

这里的:

  • --prefix 用于指定顶层安装路径,默认是 /usr/local/;
  • --host 用于指定目标平台,主要在交叉编译环境使用,为本机编译不需要此选项。一个规范的配置名称有三个部分,由破折号分隔。它看起来像这样:“cpu-company-system”

    • 常见的 CPU 类型选项有:aarch64, aarch64_be, alpha, alpha64, amdgcn, arc, arceb, arm, armeb, avr, bfin, bpf, cris, csky, epiphany, fido, fr30, frv, ft32, h8300, hppa, hppa2.0, hppa64, i486, i686, ia64, iq2000, lm32, loongarch64, m32c, m32r, m32rle, m68k, mcore, microblaze, microblazeel, mips, mips64, mips64el, mips64octeon, mips64orion, mips64vr, mipsel, mipsisa32, mipsisa32r2, mipsisa64, mipsisa64r2, mipsisa64r2el, mipsisa64sb1, mipsisa64sr71k, mipstx39, mmix, mn10300, moxie, msp430, nds32be, nds32le, nvptx, or1k, pdp11, powerpc, powerpc64, powerpc64le, powerpcle, pru, riscv32, riscv32be, riscv64, riscv64be, rl78, rx, s390, s390x, sh, shle, sparc, sparc64, tic6x, v850, v850e, v850e1, vax, visium, x86_64, xstormy16, xtensa
    • 系统类型有:aixversion, amdhsa, aout, cygwin, darwinversion, eabi, eabialtivec, eabisim, eabisimaltivec, elf, elf32, elfbare, elfoabi, freebsdversion, gnu, hpux, hpuxversion, kfreebsd-gnu, kopensolaris-gnu, linux-androideabi, linux-gnu, linux-gnu_altivec, linux-musl, linux-uclibc, lynxos, mingw32, mingw32crt, mmixware, msdosdjgpp, netbsd, netbsdelfversion, nto-qnx, openbsd, rtems, solarisversion, symbianelf, tpf, uclinux, uclinux_eabi, vms, vxworks, vxworksae, vxworksmils

以上为常用的两个指定选项修改,更多更具体的 configure 参数指定可以参考 官方文档 Configuration

3.2 Building 构建

既然GCC已经配置好了,就可以构建编译器和运行时库了。

编译某些文件时出现编译器警告是正常的。除非您是 GCC 开发人员,否则通常可以忽略这些警告,除非它们导致编译失败。开发人员应该尝试修复遇到的任何警告,但是他们可以通过指定 configure 标志 --disable-werror 暂时继续过去的警告错误

在某些旧系统上,定义某些环境变量(如CC)可能会干扰 make 的功能。 如果在源目录以外的目录中尝试构建编译器时遇到看似奇怪的错误,可能是因为您以前在源目录中配置了编译器。确保你已经做好了所有必要的准备。

如果在BSD系统上使用旧的 System V 文件系统中存储的目录构建 GCC,如果System V 文件系统不支持符号链接,则在运行 fixincludes 时可能会出现问题。这些问题导致无法修复 sys/types.h 中size_t的声明。如果您发现 size_t 是一个有符号类型,并且发生了类型不匹配,这可能是原因。解决方案是不要使用这样的目录来构建GCC。

在配置完成后,执行以下命令进行编译:

make -j8

这里的 -j8 表示使用 8 个线程进行编译,可以根据实际编译环境进行调整。

3.3 Final install 安装

编译完成后,执行以下命令进行安装:

sudo make install