设为首页 收藏本站
查看: 724|回复: 0

[经验分享] CentOS6.5 从源码编译安装 GCC-4.9.1 全程实录《第二部分:编译,安装,测试》

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-31 09:11:27 | 显示全部楼层 |阅读模式
前言
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位。

1
2
3
4
5
[iyunv@centos6-5vm 桌面]# cd /extracted-src-dir/gcc-4.9.1/
[iyunv@centos6-5vm gcc-4.9.1]# cd /compile-dir/
[iyunv@centos6-5vm compile-dir]# pwd
/compile-dir
[iyunv@centos6-5vm 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





wKiom1PYYFmDYh5LAAOxQB-QfBE687.jpg


如果以上面给出的参数集来运行configure脚本,会在 compile-dir 目录下生成
config.log,config.status,Makefile,serdep.tmp四个文件,用gedit或者其它文本编辑器打开 config.log,以 error 为关键字符串,搜索configure检测到的潜在配置错误和警告,这对后面的make阶段能否正常编译至关重要:如果没有任何与error相关的警告信息,那么就认为可以执行 make 命令。


wKioL1PYbbvx7Wv7ABHdYX8COwo245.jpg



在当前工作目录下,执行 make 命令来启动编译进程,整个编译过程花费的时间很大程度上取决于你的系统硬件配置,以及指定给configure脚本的参数,
我的硬件配置如下,大概也花了近40分钟才编译完成:


wKiom1PYcpnyc86LAAxjAXRJhJ4603.jpg


在此基础上,我用下面的命令来加速编译过程,其中 -j 指定同时开启的进程数,要充分发挥多核处理器的并行执行优势,这个值应该是处理器芯片上物理核心的2倍。根据测试,上面的硬件配置并行执行8个进程编译,大约20分钟多一些就编译完成了,所以,CPU要给力才行。


1
[iyunv@centos6-5vm compile-dir]# make -j 8





另外,如果在make中途出错退出,应该执行下面指令清空 compile-dir 目录下的相关文件,包括makefile,


1
[iyunv@centos6-5vm compile-dir]# make distclean







然后根据错误提示修改传递给 configure 脚本的参数,或者安装相关依赖库,支持包等等,重新运行configure脚本,检查 config.log文件的内容,最后再次执行 make命令。



wKiom1PYjcDwDlLlAAfhioVHV-s577.jpg


执行下面的命令将编译好的可执行文件,库文件等,从 compile-dir 复制到
/usr/local/new-exec-gcc-4.9.1/ 目录下面,完成最后的安装。


1
[iyunv@centos6-5vm compile-dir]# make install






wKiom1PYkaWhk6DBAA45f8ULtSE709.jpg




                           《测试,优化,整合make,新旧版本gcc共存》





为了方便后面的测试以及与make的整合,我们先用符号链接的方式,实现新旧版本gcc共存系统上,按需调用。


常规情况下,要用新版gcc来编译C源文件或用其它高级语言编写的源文件,需要以
/usr/local/new-exec-gcc-4.9.1/bin/gcc
这种绝对路径的形式来调用,如果仅输入命令gcc,则shell会调用旧版的gcc,也就是 /usr/bin/gcc 下的gcc,这是因为新版的gcc可执行文件所在绝对路径还没有加入shell的命令搜索路径中,而搜索路径是一种环境变量,因此按理讲应该将其加入环境变量,但是这样就会覆盖原有的gcc,或者产生歧义,shell无法判断用户的意图是要使用那一个。
使用符号链接的方案可以避免上述问题。
依旧是先确定一下旧版gcc的可执行文件所在路径:


1
2
3
4
5
[iyunv@centos6-5vm bin]# cd /
[iyunv@centos6-5vm /]# which gcc
/usr/bin/gcc
[iyunv@centos6-5vm /]# whereis gcc
gcc: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz





进入 /usr/bin 目录,创建一个指向新版gcc可执行文件所在路径的符号链接,记得要同时创建新版g++的相应链接:


1
2
3
4
5
[iyunv@centos6-5vm /]# cd /usr/bin
[iyunv@centos6-5vm bin]# pwd
/usr/bin
[iyunv@centos6-5vm bin]# ln -s /usr/local/new-exec-gcc-4.9.1/bin/gcc new-gcc-4-9-1
[iyunv@centos6-5vm bin]# ln -s /usr/local/new-exec-gcc-4.9.1/bin/g++ new-g++4-9-1





如此一来,shell还是搜索 /usr/bin 下的可执行文件,但是根据用户输入的命令来调用相应的文件,例如,用户输入 gcc,则调用 /usr/bin/gcc,用户输入 new-gcc-4-9-1,则调用相应符号链接指向的原始文件。下面的截图验证了这一部分讲述的内容:


wKiom1PZjdWT155VAAs8rXKP5Jw305.jpg


再次确认



wKioL1PZkD7DOUGnAAT9j_RSS5o728.jpg



接下来,需要将新版gcc的库文件安装路径,添加到“库的搜索路径”(LD_LIBRARY_PATH)这个环境变量中,日后链接器就会使用新添加的库路径中的动态库以及启动文件,来链接经由汇编器生成的目标文件,前面在make install结束时,系统也给出了类似的提示信息(参考前面的截图):


1
[iyunv@centos6-5vm 桌面]# vim /etc/profile





向文件中添加以下内容,并且保存退出。


1
2
#to add the  libraries of new version gcc 4.9.1 to the environment variable
export LD_LIBRARY_PATH="/usr/local/new-exec-gcc-4.9.1/lib"





需要重启系统,配置项才会生效,要立即生效而不重启,执行下面的命令:


1
[iyunv@centos6-5vm etc]# source /etc/profile



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-22968-1-1.html 上篇帖子: centos安装不支持GPT模式如何处理 下篇帖子: Centos5.6 更新yum源
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表