前言
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脚本进行参数传递,优化编译等。
整个过程简单明了,图文代码并茂,希望能起到抛砖引玉的作用,激发广大爱好者编程与学习的热情。
《编译,安装与测试》
前面我们多次提到:gcc应该在单独的目录里面进行配置和编译,不要让生成的中间文件污染了源码目录,除非你决定在整个安装过程结束后,删除源码目录和编译目录。
我们使用单独的编译目录 compile-dir 来存储经由 make 命令编译生成的二进制文件,然后用make install 命令,将这些文件复制到最终的安装目录:
/usr/local/new-exec-gcc-4
.9.1
首先,进入编译目录,在该目录下,以绝对路径的形式调用gcc源码目录下的configure脚本文件,在其后面指定编译参数,其中:
--prefix=/usr/local/new-exec-gcc-4.9.1/
就是上面讲到的最终安装路径。
--enable-bootstrap
这里引用网上一些文献对该参数的解释:用第一次编译生成的程序进行第二次编译,然后用再次生成的程序进行第三次编译,并且检查比较第二次和第三次结果的正确性,也就是进行冗余的编译检查工作。
非交叉编译环境下,默认已经将该值设为 enable,可以不用显示指定;交叉编译环境下,需要显示将其值设为 disable。
--enable-checking=release 以软件发布版的标准来对编译时生成的代码进行一致性检查;设置该选项为 enable并不会改变编译器生成的二进制结果,但是会导致编译的时间增加;该选项仅支持gcc编译器;
总体而言,对于上面这个选项,机器的硬件配置较低,以及不愿等待太久编译时间的童鞋,可以设置为 disable;但是这会增加未预期的错误风险,所以应该慎用。
可以同时设置 --disable-bootstrap
与 --disable-checking,这对编译过程的提速很有帮助。
--enable-threads=posix 顾名思义,启用posix标准的线程支持
要让程序能在符合POSIX规范的linux发布版上正确运行,就应该启用该选项,取决于宿主或目标操作系统的类型,其它可用值有:aix,dec,solaris,win32等,如果你是其它的类UNIX系统,就需要设置相应的值。
--enable-languages=c,c++
支持的高级语言类型和运行时库,可以设置的所有语言包括 ada,c,c++,Fortran,java,objc,obj-c++,GO 等语言。这里只开启了c和c++,因为支持的语言越多,就需要安装越多的相应静态与动态库,还有五花八门的依赖库,这会让管理变得困难,体积也会变得庞大。
--disable-multilib 很多文章对这个参数的解释让人摸不着头脑。简单的讲,如果你的操作系统是32位,默认就已经设置为 disable,这意味着gcc仅能生成32位的可执行程序;如果你的操作系统是64位,默认就已经设置为 enable,这意味着用gcc编译其它源文件时可以通过 -m32 选项来决定是否生成32位机器代码。
如果在64位系统上,要禁止生成32位代码, 设置 --disable-multilib。
--enable-gather-detailed-mem-stats
允许收集详细的内存使用信息,如果设置该参数为 enable,则将来编译好的gcc可执行程序,可以通过 -fmem-report 选项来输出编译其它程序时的实时内存使用情况。
--with-long-double-128
指定 long double 类型为128位(16字节!);设置为 without,则 long double类型将为64位(8字节),这将与普通的 double 类型一样。
基于 Glib 2.4以上版本编译时,默认已经是128位。
[[email protected] 桌面]# cd /extracted-src-dir/gcc-4.9.1/ [root[email protected] gcc-4.9.1]# cd /compile-dir/ [[email protected] compile-dir]# pwd /compile-dir [[email protected] compile-dir]# /extracted-src-dir/gcc-4.9.1/configure --prefix=/usr/local/new-exec-gcc-4.9.1/ --enable-bootstrap --enable-checking=release --enable-threads=posix --enable-languages=c,c++ --enable-gather-detailed-mem-stats -with-long-double-128
如果以上面给出的参数集来运行configure脚本,会在 compile-dir 目录下生成
config.log,config.status,Makefile,serdep.tmp四个文件,用gedit或者其它文本编辑器打开 config.log,以 error 为关键字符串,搜索configure检测到的潜在配置错误和警告,这对后面的make阶段能否正常编译至关重要:如果没有任何与error相关的警告信息,那么就认为可以执行 make 命令。
在当前工作目录下,执行 make 命令来启动编译进程,整个编译过程花费的时间很大程度上取决于你的系统硬件配置,以及指定给configure脚本的参数,
我的硬件配置如下,大概也花了近40分钟才编译完成:
CentOS6.5 从源码编译安装 GCC-4.9.1 全程实录《第二部分:编译,安装,测试》