版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、前言GCC(GNU Compiler Collection,GNU编译器合集)是linux以及其他类UNIX平台上进行开源项目,软件开发等必不可少的工具链组成之一(工具链的其他成员包括 binutils,Glibc,libstdc+ 等)另 外,对于程序员以及系统管理员而言,经常需要从软件的源码手动编译安装,而不论是configure脚本,还是make工具/makefile文件,最终 都需要调用gcc(或者其它编译器)来进行实际的编译工作,因此,经常需要使用gcc的新版特性,并且与旧版gcc共存,根据实际的需求进行调用。在本篇博文中,我们以centos6.5 32位 系统上已安装的
2、旧版gcc二进制可执行文件以及Glibc C库为基础,从网上下载最新版的gcc源码包手动编译安装,进行简单的测试,并且与make工具整合,从configure脚本进行参数传递,优化编译等。整个过程简单明了,图文代码并茂,希望能起到抛砖引玉的作用,激发广大爱好者编程与学习的热情。 编译,安装与测试前面我们多次提到:
3、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/
4、0; 就是上面讲到的最终安装路径。-enable-bootstrap 这里引用网上一些文献对该参数的解释:用第一次编译生成的程序进行第二次编译,然后用再次生成的程序进行第三次编译,并且检查比较第二次和第三次结果的正确性,也就是进行冗余的编译检查工作。非交叉编译环境下,默认已经将该值设为 enable,可以不用显示指定;交叉编译环境下,需要显示将其值设为 disable。-enable-checking=release 以软件发布版的标准来对编译时生成的代码进行一致性检查;设置该选项为 enable并不会改变编译器生成的二进制结果,但是会导致编译的时间
5、增加;该选项仅支持gcc编译器;总体而言,对于上面这个选项,机器的硬件配置较低,以及不愿等待太久编译时间的童鞋,可以设置为 disable;但是这会增加产生未预期的错误的风险,所以应该慎用。可以同时设置 -disable-bootstrap 与 -disable-checking,这对编译过程的提速很有帮助。-enable-threads=posix 顾名思义,启用posix标准的线程支持要让程序能在符合POSIX规范的linux发布版上正确运行,就应该启用该选项,取决于宿主或目标操作系统的类型,其它可用值有:aix,dec,solaris,win
6、32等,如果你是其它的类UNIX系统,就需要设置相应的值。-enable-languages=c,c+ 支持的高级语言类型和运行时库,可以设置的所有语言包括 ada,c,c+,Fortran,java,objc,obj-c+,GO 等语言。这里只开启了c和c+,因为支持的语言越多,就需要安装越多的相应静态与动态库,还有五花八门的依赖库,这会让管理变得困难,体积也会变得庞大。-disable-multilib 很多文章对这个参数的解释让人摸不着头脑。简单的讲,如果你的操作系统是32位,默认就已经设置为 disable,这意味着
7、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位
8、(16字节!);设置为 without,则 long double类型将为64位(8字节),这将与普通的 double 类型一样。基于 Glib 2.4以上版本编译时,默认已经是128位。12345rootcentos6-5vm 桌面# cd /extracted-src-dir/gcc-4.9.1/rootcentos6-5vm gcc-4.9.1# cd /compile-dir/rootcentos6-5vm compile-dir# pwd/compile-dirrootcentos6-5vm c
9、ompile-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脚本,会
10、在 compile-dir 目录下生成config.log,config.status,Makefile,serdep.tmp四个文件,用gedit或者其它文本编辑器打开 config.log,以 error 为关键字符串,搜索configure检测到的潜在配置错误和警告,这对后面的make阶段能否正常编译至关重要:如果没有任何与error相关的警告信息,那么就认为可以执行 make 命令。在当前工作目录下,执行 make 命令来启动编译进程,整个编译过程花费的时间很大程度上取决于你的系统硬件配置,以及指定给configure脚本的参数,我的硬件配置如下,大概也花了近40分
11、钟才编译完成:在此基础上,我用下面的命令来加速编译过程,其中 -j 指定同时开启的进程数,要充分发挥多核处理器的并行执行优势,这个值应该是处理器芯片上物理核心的2倍。根据测试,上面的硬件配置并行执行8个进程编译,大约20分钟多一些就编译完成了,所以,CPU要给力才行。1rootcentos6-5vm compile-dir# make -j 8另外,如果在make中途出错退出,应该执行下面指令清空 compile-dir 目录下的相关文件,包括makefile,1rootcentos6-5vm compile-dir# make
12、60;distclean然后根据错误提示修改传递给 configure 脚本的参数,或者安装相关依赖库,支持包等等,重新运行configure脚本,检查 config.log文件的内容,最后再次执行 make命令。执行下面的命令将编译好的可执行文件,库文件等,从 compile-dir 复制到/usr/local/new-exec-gcc-4.9.1/ 目录下面,完成最后的安装。1rootcentos6-5vm compile-dir# make install如果你的硬盘空间比较吃紧,或者有良好的磁盘清理习惯,那么不妨删除 compile-dir
13、60; 以及 extracted-src-dir 目录中的内容,并且备份 downloaded-src-dir 目录中的所有6个源码包,日后有需要时可以再次从源码编译安装。 测试,优化,整合make,新旧版本gcc共存为了方便后面的测试以及与make的整合,我们先用符号链接的方式,实现新
14、旧版本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的
15、可执行文件所在路径:12345rootcentos6-5vm bin# cd /rootcentos6-5vm /# which gcc/usr/bin/gccrootcentos6-5vm /# whereis gccgcc: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz进入 /usr/bin 目录,创建一个指向新版gcc可执行文件所在路径的符号链接,记得要同时创建新
16、版g+的相应链接:12345rootcentos6-5vm /# cd /usr/binrootcentos6-5vm bin# pwd/usr/binrootcentos6-5vm bin# ln -s /usr/local/new-exec-gcc-4.9.1/bin/gcc new-gcc-4-9-1rootcentos6-5vm bin# ln -s /usr/local/new-exec-gcc-4.9.1/bin/g+ new-g+4
17、-9-1如此一来,shell还是搜索 /usr/bin 下的可执行文件,但是根据用户输入的命令来调用相应的文件,例如,用户输入 gcc,则调用 /usr/bin/gcc,用户输入 new-gcc-4-9-1,则调用相应符号链接指向的原始文件。下面的截图验证了这一部分讲述的内容:再次确认:接下来,需要将新版gcc的库文件安装路径,添加到“库的搜索路径”(LD_LIBRARY_PATH)这个环境变量中,日后链接器就会使用新添加的库路径中的动态库以及启动文件,来链接经由汇编器生成的目标文件,前面在make install结束时,系统也给出了类似的提示信息(参考前面的截图):1rootcentos6-
18、5vm 桌面# vim /etc/profile向文件中添加以下内容,并且保存退出。12#to add the libraries of new version gcc 4.9.1 to the environment variableexport LD_LIBRARY_PATH="/usr/local/new-exec-gcc-4.9.1/lib"需要重启系统,配置项才会生效,要立即生效而不重启,执行下
19、面的命令:1rootcentos6-5vm etc# source /etc/profile对 /etc/profile 文件内容的改动将影响系统中的所有用户以及包括 bash shell在内的常用 shell,这意味着,在进行团队协作软件开发,结对编程时,上面的设置能确保使用各自用户账户登录系统的程序员能在开发过程中共享新添加的库,还可以避免因为链接到的库不一致而产生冲突。此后,我们可以立即执行下面的命令来打印并输出 $LD_LIBRARY_PATH 的当前值,从而验证上面讲到的相关内容:12rootcentos6-5vm 桌面#
20、echo $LD_LIBRARY_PATH /usr/local/new-exec-gcc-4.9.1/lib顺便一提,如果你使用类似下面的命令来直接在当前开启的shell设置 LD_LIBRARY_PATH 环境变量,那么:1. 关闭shell后,所做的更改将会丢失,往后需要再次添加2. 登出 X-window ,使用其它账户登入,需要再次添加3. 系统重启后,需要再次添加1rootcentos6-5vm /# declare -x LD_LIBRARY_PATH="/usr/local/new-exec-gcc-4.9.
21、1/lib" 新版gcc与make,configure配置脚本的协作编译现在,可以通过新版本的gcc来编译单独
22、的C/C+源文件,但是对于大型的开源项目,其中有成百上千个源文件,不可能手动一个个编译,幸好成体系的软件项目都带有 configure脚本,可以显式给 configure脚本指定要使用的编译器,这是通过向configure脚本传递环境变量 CC来实现的,而CC的值可以在传递给 configure前临时定义,详情容后再作介绍因为有些中小型项目的源码包里面没有提供 configure脚本,因此如果不在configure阶段指定编译器,那么在其后的make阶段指定也行,因为make也读取CC的值来判断要使用那种编译器:12345rootcentos6-5vm 桌面# make
23、160;-p | grep CCmake: * 没有指明目标并且找不到 makefile。 停止。LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH)CC = ccCPP = $(CC) -E12345rootcentos6-5vm 桌面# make -p | grep CXXmake: * 没有指明目标并且找不到 ma
24、kefile。 停止。LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -cCXX = g+可以看到,make默认使用 CC作为C编译器;使用CXX作为C+编译器。而cc是 /usr/bin 下的符号链接,它就指向 /usr/bin 下的旧版 gcc
25、编译器:另外,CXX的值 g+,是 /usr/bin下的旧版C+编译器:我们需要将 cc指向新安装的gcc的二进制可执行文件。在这之前,先删除掉系统原来创建的到旧版gcc的链接:123rootcentos6-5vm 桌面# cd /usr/binrootcentos6-5vm bin# rm -f ccrootcentos6-5vm bin# ln -s /usr/local/new-exec-gcc-4.9.1/bin/gcc cc再次查看 cc 的属性,确认变
26、更已经生效:还记得前面我们将自定义名称的新版编译器(new-gcc-4-9-1)链接到同一个二进制可执行文件吗:1rootcentos6-5vm bin# ln -s /usr/local/new-exec-gcc-4.9.1/bin/gcc new-gcc-4-9-1这并不会产生冲突,现在, cc和new-gcc-4-9-1实际都指向同一个新版的gcc,而关键是,make这种自动编译大型项目的工具只会使用cc,因此修改cc指向的程序来让make调用新版的gcc编译软件源码就显得尤为重要。下面这张截图验证了上面我们的劳动成果:另一种办法是,从make的配置输出可知,cc的值赋给了环境变量CC,因此直接把cc用新版的gcc编译器的绝对路径替换掉也可以:修改 /home/user/.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版不锈钢保温水箱旅游景区供水系统供应合同
- 2024年度餐厅顾客满意度调查与改进合同
- 2024年度河堤清淤及绿化工程承包合同
- 2024年度餐厅线上线下融合发展战略合同
- 2024年度品牌形象代言合同:品牌方与代言人之间就品牌形象代言达成的合同
- 2024年度售后服务合同:不锈钢产品质保与维修协议
- 工业矿产交易合同
- 学校物资订购合同样本
- 网站升级运维服务合同
- 教育技术培训服务合同
- 2023-2024学年广东省深圳市南山区八年级(上)期末英语试卷
- 北京市丰台区2024-2025学年高二上学期11月期中考试生物试题 含解析
- 2024美团外卖服务合同范本
- 选择性必修第一册人教A版2024-2025学年上学期期中高二数学模拟测试卷含答案
- 2023~2024学年第一学期高一期中考试数学试题含答案
- 年度电驱动石油深井钻机市场分析及竞争策略分析报告
- 非遗漆扇扇子科普宣传
- GB/T 15822.1-2024无损检测磁粉检测第1部分:总则
- MOOC 马克思主义民族理论与政策-广西民族大学 中国大学慕课答案
- 一种基于STM32的智能门锁系统的设计-毕业论文
- 《海子诗人简介》PPT课件.ppt
评论
0/150
提交评论