虽然自己的简历上写着熟悉C/C++,但是之前说白了,自己也是用C++的编译器写着C代码的程序员,C++一些比较强大的语言特性并没有很好的融入到自己的代码当中.当然,写Win驱动的话,我还是喜欢比较原始的C方式^_^.Leonard跟我说之后会用到STL相关的东西,借着这个机会想着,学点强悍的东西总是没有坏处的,果断的买了书,一开始买了本
作为一个程序员的求知欲望让我又买了侯捷老湿的
说了那么多无紧要的东西,开始吹吹水嘛大家懂的.下面入正题,欢迎兄弟们交流^_^
买标准程序库一书的时候上过作者的网站看过,4月份似乎新的版本又会出来了,结合新的C++标准.之前对C++的最新标准只是知道,但是并没有关注,昨天看完源码解析traits一章之后觉得应该花点时间消化一下.果断找点新东西搞搞,结果就有了这篇GCC4.7.0的编译心得.之后我会把自己看的一些相关的东西贴上来,分享一下,如果同学们有好的材料,也可以推荐给我啵.C++的新标准现在称为C++11,C++0x最终定稿的版本吧我猜.维基百科上面对C++11的中文介绍不错,有爱的同学可以看看(最后贴网址),对于新标准的支持,GCC无疑是做的比较好的(具体请猛击:http://gcc.gnu.org/projects/cxx0x.html).开了Backtrack5看了下,里面的gcc还是停留在4.4.x的版本,apt-get了一下,没有收获,想着就靠自己呗,编译一个新版本.从吃完晚饭开始弄,一开始有错误,一个个百度google,最后一直卡在一个错误上,中间出去俱乐部开了个会,回来后接着干,最后11点多12点时候开始编译,等到1点多实在困,就上床眠了,早上起来,成功编译了,哇哈哈哈哈.把一些经验记录下来供同学们参考(ps,一些琐碎简单的问题我就不说了):
1.关于提前准备的组件问题
gcc-4.7.0的编译需要用到3个额外组件,分别是mprf-2.4.2, gmp-4.3.2, mpc-0.8.1,在gcc源代码目录下有一个contrib的文件夹,里面的download_prerequisites的脚本,就是下载这3个组件的.我执行这个脚本的时候貌似有问题,下载第二个的时候自己卡住了,所以我是按照脚本手动下载和操作,之后自己make和make install.按照顺序来(gmp->mpfr->mpc,他们有依赖关系的).如下图
重复一下,下载完解压完,分别进入3个组件的文件夹,分别make和make install安装到系统当中去
2.编译生成文件存放目录问题
gcc的编译不能直接在源文件的根目录下编译,必须建一个新的文件夹,在里面编译,这样做的好处是生成的编译文件不会影响源文件的内容,如果编译失败或者需要重新编译新版本,只需要删除存放目录就可以了,简洁明了.举例来说,在源代码根目录下mkdir gcc-4.7 -> cd gcc-4.7 -> ../configure调用配置功能生成makefile,后面我们细说configure参数,这里注意configure前面的" ../ "是必须的,利用上一级目录的configure在当前目录生成配置文件.
3.配置参数configure
配置参数是一项复杂工程,具体的配置你可以参考gcc配置说明页,另外一个做法是参考系统的(老版本)gcc的配置,使用gcc -v可以参看,你需要做的是根据你的需求修改一些特定的参数,比如--prefix,如图,这个是Backtrack5r2 gcc的配置:
--prefix是将来make install要安装到的文件夹,如果采取默认的话可能会覆盖系统当前的gcc,如果你想保留旧的gcc,最好设置--prefix参数.Backtrack5r2的所有软件包括源当中的软件都是见过稳定性测试的.我建议是不要替换系统的版本,装到另外的地方.我没有采取那么复杂的配置,大多数保留默认,我的配置如图:
4.编译过程
我前前后后编译了大概5次(想起了那次编译内核-___-),一开始都是报错,而我又被出错的日志误导,所以一直没有找到解决的点,最后google从GCC邮件列表当中找到线索才解决.先说一下正确的流程,当configure之后,shell里面需要设置两个环境变量,分别是: export LD_RUN_PATH=/usr/local/lib export LD_LIBRARY_PATH=/usr/local/lib 之后再make就顺利了.我这里说说我遇到的错误.
度娘关键字: error: in libgcc; error: cannot compute suffix of object files: cannot compile
一开始用这些google,百度并没有找到解决方案,下面说config.log有更详细的细节,果断看一下,结果被这个config.log误导了,绕了很大一圈.
/*++
configure:3407: /root/software/Linux-GCC/gcc-4.7.0/gcc-4.7/./gcc/xgcc -B/root/software/Linux-GCC/gcc-4.7.0/gcc-4.7/./gcc/ -B/root/gcc-4.7.0/i686-pc-linux-gnu/bin/ -B/root/gcc-4.7.0/i686-pc-linux-gnu/lib/ -isystem /root/gcc-4.7.0/i686-pc-linux-gnu/include -isystem /root/gcc-4.7.0/i686-pc-linux-gnu/sys-include -V >&5
xgcc: error: unrecognized command line option '-V'
xgcc: fatal error: no input files
compilation terminated.
configure:3418: $? = 1
configure:3407: /root/software/Linux-GCC/gcc-4.7.0/gcc-4.7/./gcc/xgcc -B/root/software/Linux-GCC/gcc-4.7.0/gcc-4.7/./gcc/ -B/root/gcc-4.7.0/i686-pc-linux-gnu/bin/ -B/root/gcc-4.7.0/i686-pc-linux-gnu/lib/ -isystem /root/gcc-4.7.0/i686-pc-linux-gnu/include -isystem /root/gcc-4.7.0/i686-pc-linux-gnu/sys-include -qversion >&5
xgcc: error: unrecognized command line option '-qversion'
xgcc: fatal error: no input files
compilation terminated.
configure:3418: $? = 1
configure:3434: /root/software/Linux-GCC/gcc-4.7.0/gcc-4.7/./gcc/xgcc -B/root/software/Linux-GCC/gcc-4.7.0/gcc-4.7/./gcc/ -B/root/gcc-4.7.0/i686-pc-linux-gnu/bin/ -B/root/gcc-4.7.0/i686-pc-linux-gnu/lib/ -isystem /root/gcc-4.7.0/i686-pc-linux-gnu/include -isystem /root/gcc-4.7.0/i686-pc-linux-gnu/sys-include -o conftest -g -O2 conftest.c >&5
/root/software/Linux-GCC/gcc-4.7.0/gcc-4.7/./gcc/cc1: error while loading shared libraries: libmpc.so.2: cannot open shared object file: No such file or directory
configure:3437: $? = 1
configure:3625: checking for suffix of object files
configure:3647: /root/software/Linux-GCC/gcc-4.7.0/gcc-4.7/./gcc/xgcc -B/root/software/Linux-GCC/gcc-4.7.0/gcc-4.7/./gcc/ -B/root/gcc-4.7.0/i686-pc-linux-gnu/bin/ -B/root/gcc-4.7.0/i686-pc-linux-gnu/lib/ -isystem /root/gcc-4.7.0/i686-pc-linux-gnu/include -isystem /root/gcc-4.7.0/i686-pc-linux-gnu/sys-include -c -g -O2 conftest.c >&5
/root/software/Linux-GCC/gcc-4.7.0/gcc-4.7/./gcc/cc1: error while loading shared libraries: libmpc.so.2: cannot open shared object file: No such file or directory
configure:3651: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "GNU C Runtime Library"
| #define PACKAGE_TARNAME "libgcc"
| #define PACKAGE_VERSION "1.0"
| #define PACKAGE_STRING "GNU C Runtime Library 1.0"
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL "http://www.gnu.org/software/libgcc/"
| /* end confdefs.h. */
|
| int
| main ()
| {
|
| ;
| return 0;
| }
configure:3665: error: in `/root/software/Linux-GCC/gcc-4.7.0/gcc-4.7/i686-pc-linux-gnu/libgcc':
configure:3668: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details.
--*/
一开始以为返回值为1就是发生错误,所以从第一个错误出现的地方开始入手,也就是xgcc: error: unrecognized command line option '-V' xgcc: fatal error: no input files,结合之前的命令行参数,还以为是编译的时候缺少某些系统文件,我最初的configure配置是使用默认prefix,所以参数是类似/usr/i686-pc-linux-gnu/include之类的,一直没弄清i686-pc-linux-gnu究竟是神马文件夹,还以为是内核头文件,解决的思路一直停留在可能是配置参数出问题,所以改了几次参数编译,最终都是同样的错误.
最后通过google,发现gcc的邮件列表中有一个人提到相同的问题,说卡在xgcc的 -V参数上,跟我的一样,但是后面有个人说,这个不是真正的问题,真正问题是最后一个错误出现的地方,我擦,恍然大悟..最后一个错误是error while loading shared libraries: libmpc.so.2: cannot open shared object file: No such file or directory, 继续沿着这条线索,得知需要在一开始设置两个环境变量LD_RUN_PATH和LD_LIBRARY_PATH,具体参考上面第3条.
折腾到这个时候已经11点多了,开始编译,等到1点多,没有发生问题,觉得这次应该稳了,果断上床睡了(因此我不知道具体编译了多久,保守估计应该都是要3-4个小时吧,我家小白只是单核1,7GHz和1G内存而已-__-),早上醒来看了一下,木有问题,make install安装到--prefix的制定路径,之后写了一个新特性初始化参数列表的cpp,用-std=c++11编译通过,哇哈哈哈哈~
5.其他
注意一下,编译的磁盘空间估计都是要有3或4G的空闲了(我只是--enable-languages=c,c++)
末尾的吐槽: 听说昨天腾讯笔试广州场的有5000+人,技术类的题目感觉比去年难啊,威哥说周围的人都是55+分,伤不起啊-____-
参考资料:
gcc编译
1.http://hi.baidu.com/syqust/blog/item/20c5fcf2065fd30bb07ec589.html
2.http://blog.csdn.net/hello_wyq/article/details/3988493
3.http://hi.baidu.com/ldg__2050/blog/item/4b0fb514d96a675df3de32d7.html
4.http://gcc.gnu.org/ml/gcc-help/2011-11/msg00038.html
5.http://forum.ubuntu.org.cn/viewtopic.php?f=56&t=154043
6.http://hi.baidu.com/hawk_kt/blog/item/506f64dc7a2a4a2b5982ddb9.html#0
c+11
1.http://chenlq.net/cpp11-faq c++之父关于c++11的faq中文翻译版,有imcc同学翻译
2.http://zh.wikipedia.org/wiki/C%2B%2B11 维基百科对c++11的解释
3.http://gcc.gnu.org/projects/cxx0x.html gcc对c++11特性的支持列表