前言
GCC(GNU Compiler Collection,GNU编译器合集)是linux以及其他类UNIX平台上进行开源项目,软件开发等必不可少的工具链组成之一(工具链的其他成员包括 binutils,Glibc,libstdc++ 等)
另外,对于程序员以及系统管理员而言,经常需要从软件的源码手动编译安装,而不论是configure脚本,还是make工具/makefile文件,最终都需要调用gcc(或者其它编译器)来进行实际的编译工作,因此,经常需要使用gcc的新版特性,并且与旧版gcc共存,根据实际的需求进行调用。
在本篇博文中,我们以centos6.5 32位 系统上已安装的旧版gcc二进制可执行文件以及Glibc C库为基础,从网上下载最新版的gcc源码包手动编译安装,进行简单的测试,并且与make工具整合,从configure脚本进行参数传递,优化编译等。
整个过程简单明了,希望能起到抛砖引玉的作用,激发广大爱好者编程与学习的热情。
《基础知识/先决条件》
软件包名词解释 centos6.5默认有无安装 是否需要安装才能从源码编译安装gcc
Glibc GNU项目实现的C标准库。
分源码包和二进制RPM包,centos6.5“最小桌面”安装方案,默认已通过RPM包的形式装上,
Glibc是非交叉编译环境下,从源码编译安装gcc必备的。
***** 如果是交叉编译的环境,即在一种硬件架构/操作系统上编译(宿主机),但是生成的二进制可执行文件要在另一种硬件架构/操作系统上运行(目标机),在这种情况下,不能依赖宿主机器上已编译的C库,最好是自行下载glibc的源码并编译。 *****
glibc-static GNU C标准库的静态版,只有在用于 -static 静态链接时才需要,
在yum软件仓库上只有二进制RPM包,centos6.5“最小桌面”安装方案,默认没有安装,
glibc-static是非交叉编译环境下,从源码编译安装gcc必备的,而且它依赖于Glibc(要先装Glibc)
libstdc++ 兼容GCC的C++标准库。
在yum软件仓库上只有二进制RPM包,centos6.5“最小桌面”安装方案,默认已通过RPM包的形式装上,
从源码编译安装gcc时,如果需要编译其组件:c++编译器(g++),则需要依赖 libstdc++,所幸系统已经安装好了
gcc(已安装的旧版) GNU编译器合集,包含c,c++编译器,还有Fortran,Ada等编译器,
分源码包和二进制RPM包,yum软件仓库上只有二进制RPM包,而且是旧版的(4.4.7版),
centos6.5“最小桌面”安装方案,默认连这个旧版都没有装上,
从源码编译安装新版gcc前,要求系统上已经安装有旧版gcc
gcc-c++ GNU编译器合集的c++增强支持包,它向gcc的c++编译器提供了更多对当前c++标准规范的支持,包含模板和错误处理。
在yum软件仓库上只有二进制RPM包,centos6.5“最小桌面”安装方案,默认没有安装,
经过笔者的测试,如果系统上没有预先安装 gcc-c++,则在编译新版gcc后面的 make 阶段会因为产生错误而退出,并且,gcc-c++ 可能还需要额外的 libstdc++ 支持,
因此最好还是通过yum先把 gcc-c++ 装上。
综上所述,在centos6.5“最小桌面”安装方案前提下,我们需要安装的软件包有:
gcc, gcc-c++, glibc-static
《准备工作》
首先,分别验证这3个软件包的状态,确保万无一失:
[[email protected] 桌面]# rpm -qi gcc [[email protected] 桌面]# locate gcc [[email protected] 桌面]# which gcc [[email protected] 桌面]# whereis gcc
[[email protected] 桌面]# rpm -qi gcc-c++ [[email protected] 桌面]# locate gcc-c++ [[email protected] 桌面]# which gcc-c++ [[email protected] 桌面]# whereis gcc-c++
[[email protected] 桌面]# rpm -qi glibc-static [[email protected] 桌面]# locate glibc-static [[email protected] 桌面]# which glibc-static [[email protected] 桌面]# whereis glibc-static
其次,我们可以先了解一下,关于已经安装的2个软件包:Glibc 和 libstdc++ 的详细信息:
[[email protected] 桌面]# rpm -qi glibc [[email protected] 桌面]# locate glibc [[email protected] 桌面]# which glibc [root[email protected] 桌面]# whereis glibc
[[email protected] 桌面]# rpm -qi libstdc++ [[email protected] 桌面]# locate libstdc++ [[email protected] 桌面]# which libstdc++ [[email protected] 桌面]# whereis libstdc++
有了上面的基础知识后,就可以用yum 来下载安装二进制形式的旧版gcc以及 glibc-static ,gcc-c++的RPM 软件包:
(顺便一提,yum 上的glibc版本较新,可用于升级系统现有的glibc)
[[email protected] 桌面]# yum check-update [[email protected] 桌面]# yum list gcc gcc-c++ glibc-static glibc [[email protected] 桌面]# yum install glibc-static gcc gcc-c++
我们先查询一下安装好的旧版gcc,g++的相关文件路径,后面的阶段会用到这些路径:(用于实现在系统上共存新版和旧版的GCC,根据需求选择性调用)
[[email protected] 桌面]# which gcc [[email protected] 桌面]# which g++ [[email protected] 桌面]# whereis gcc [[email protected] 桌面]# whereis g++ [[email protected] 桌面]# rpm -ql glibc-static
从上面的输出得知:
首次在系统安装(旧版的)gcc后,安装在 /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz 等路径下,
由此可见,从二进制旧版gcc安装时,系统默认将gcc的
可执行文件(安装到 /usr/bin/gcc),
库文件(安装到 /usr/lib/gcc),
编译器(cc1)/预链接器(collect2)(安装到 /usr/libexec/gcc)
放在不同的目录下,
(头文件放在 /usr/lib/gcc/i686-redhat-linux/4.4.4/include 目录下)
其中,cc1负责对源文件实际的编译工作;collect2进行预链接处理,实际的链接由链接器ld完成;
而centos6.5最小桌面安装默认将汇编器as的可执行文件安装在 /usr/bin/as ;默认将链接器ld的可执行文件安装在 /usr/bin/ld;
另外, /bin 以及 /sbin 目录下的可执行文件一般供用户在shell中输入指令来调用;/usr/libexec/ 目录下的可执行文件,一般不由用户直接调用,而是由某个程序或工具软件调用,辅助前者完成特定任务
自从gcc4.4.7版本开始,官方推荐使用单独的目录,而不是在解压gcc源码后的目录中进行编译,原因在于:
优化以及生成性能更好的二进制可执行文件;
避免不可预期的错误发生;
避免污染源码所在目录;
因此,我们需要在文件系统的根目录 / 下建立3个目录,方便编译过程的管理;
还需要在 /usr/local/ 目录下建立用于存放最终生成的新版gcc的目录,并使用
configure脚本的 --prefix=/usr/local/[自定义的路径名称] 来指定,这样,gcc的可执行文件,库文件,头文件就会井然有序分别存放在相应的子目录下,日后不用时直接 rm -rf 整个安装路径就可以了,因为gcc没有 uninstall的功能进行卸载。
相比旧版本的gcc使用 /usr/bin, /usr/lib /usr/libexec 目录来存放各自的文件,这种集中管理的办法显得更效率和安全,不会错误的卸载或删除到不相关的文件。
上面的一堆废话,用 shell 命令来表达,如下:
[[email protected] 桌面]# cd / [[email protected] /]# mkdir {downloaded-src-dir,extracted-src-dir,compile-dir} [[email protected] /]# cd /usr/local [[email protected] local]# mkdir new-exec-gcc-4.9.1 [[email protected] local]# cd new-exec-gcc-4.9.1/ [[email protected] new-exec-gcc-4.9.1]# pwd /usr/local/new-exec-gcc-4.9.1
所有的前置工作都完成后,接着,我们从GNU的gcc项目的官方 ftp 下载站点:
ftp://gcc.gnu.org/pub/gcc/releases/
来下载最新版的gcc源码包。权威的信息和版本更新说明,安装指南可以从这里获取:
CentOS6.5 从源码编译安装 GCC-4.9.1 全程实录,包含测试使用《图文教程》