介绍
GCC 全称是 GNU Compiler Collection。 GCC 原本是指 C 语言的编译器,后来逐渐集成了许多其他语言的编译,因次其含义就改成了 GNU Compiler Collection,它能支持编译的语言有 C, C++, Fortran, Objective C, Objective C++, 以及 Go 语言。它甚至还能编译 Ada 和 Java,但是有特殊的要求,这里暂不详述。
本文介绍在 Ubuntu 系统中源码安装 GCC 最新的发布版 GCC 6.3.0,在其他 Linux 系统中的安装方法类似。
如果当前的机器是升级安装,最好不要覆盖原有的 GCC 版本,因为如果本地安装了第三方的 Kernel 组件的话,一旦覆盖安装,有可能导致这些组件无法工作,除非我们把这些安装的第三方库及组件也使用最新安装的 GCC 重新编译。
下载
http://ftpmirror.gnu.org/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2
ftp://ftp.gnu.org/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2
MD5 sum: 677a7623c7ef6ab99881bc4e048debb6
size: 95 MB
Estimated disk space required: 7.7 GB (with tests)
依赖
- GMP4.2+, MPFR 2.4.0+, and MPC 0.8.0+
- flex
- zlib
编译
case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac
mkdir build &&
cd build &&
../configure \
--prefix=/usr \
--disable-multilib \
--with-system-zlib \
--enable-languages=c,c++,fortran,go,objc,obj-c++ &&
make
如果缺少依赖,那么可能会在执行 ./configure
的过程中出现错误,也可能在执行 make
进行编译的过程中出现错误。
(1) GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+
configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify their locations.
在 Ubuntu 中执行这个命令可以安装上述3个依赖包:
$ sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev
如果想源码安装上述3个依赖包的最新版本,可以参考这篇文章:
(2) flex
sudo apt-get install flex
如果需要源码编译安装,那么 flex 有如下依赖:
- compiler suite - flex is built with gcc
- bash, or a good Bourne-style shell
- m4 - m4 -p needs to work; GNU m4 and a few others are suitable
- GNU bison; to generate parse.c from parse.y
- autoconf; for handling the build system
- automake; for Makefile generation
- gettext; for i18n support
- help2man; to generate the flex man page
- tar, gzip, lzip, etc.; for packaging of the source distribution
- GNU texinfo;
(3) zlib
sudo apt-get install zlib1g-dev
注意: 执行 make
进行编译后,这个过程会非常漫长,如果机器性能一般,可能长达好几个小时,请做好心理准备。
安装
一旦成功编译,安装过程就非常简单,因为这个步骤只是把编译好的文件(二进制,库,头文件,文档等)拷贝到系统目录。 执行下列命令进行安装(确保是 root 权限下操作)。
make install
编译选项相关解释
--disable-multilib: 这个选项只会生成当前系统的库,比如当前系统是64位,那么只会生成 64 位的库,而不会生成 32 位的库。
--with-system-zlib: 使用系统的 zlib 库,而不是源码中附带的 zlib。如果系统没有安装 zlib,那么可以执行apt-get install zlib1g-dev
来安装
--enable-languages=c,c++,fortran,go,objc,obj-c++: 指定生成哪些语言所需的编译器,如果不指定,那么默认会编译所有语言所需的编译器。
--with-default-libstdcxx-abi=gcc4-compatible: 如果是升级安装 GCC 并且原 GCC 版本地狱 5.1.0 的话,这个选项可以让你避免重编译原有的C++语言所编写的库
make -k check: 在跑测试的时候即使遇到 error 也不停下来,而是跑完所有 test。
../contrib/test_summary: 这个命令可以生成总的测试结果概述。
mv -v /usr/lib/*gdb.py ...: 把一些 gdb 可能要用到的文件放到 /usr/lib 目录中。
所有安装的程序及库
Installed Programs: gccgo, go, gofmt and gfortran, hard-linked to architecture specific names
Installed Libraries: libgfortran.{so,a}, libgo.{so,a}, libgobegin.a, libgolibbegin.a, libnetgo.a, libobjc.{so,a}, and numerous other run-time libraries and executables
Installed Directories: /usr/lib/go/6.3.0
二进制程序介绍
gccgo 一个基于 GCC 的 Go 语言编译器
go 用于管理 Go 源码的工具
gofmt 用于格式化 Go 源码
gfortran 一个基于 GCC 的 Fortran 语言编译器
参考
http://www.linuxfromscratch.org/blfs/view/cvs/general/gcc.html