因为最近在做的一个项目中要用C++11新特性,而在 g++ 4.9 之前,regex 库并不支持 ECMAScript 的正则语法,换句话说,在 g++4.9 之前,g++ 对 C++11 标准库的支持并不完善,为保证本次项目的顺利进行,故将 g++ 版本升级至 4.9 以上。
G++ is no longer a separate distribution. Version 2 of G++ is an integral
part of GCC. You should get the gcc-2.n.tar.gz sources (where n is the
highest numbered archive) in the gcc/ directory.
C++ users will almost certainly need to retrieve the libstdc+±2.n.tar.gz
distribution as well, since that’s where all the standard C++ stream classes
(and header files like iostream.h) live.
wget ftp://mirrors.kernel.org/gnu/gcc/gcc-4.9.4/gcc-4.9.4.tar.bz2
其他版本:mirrors.kernel.org/gnu/gcc
tar -jxvf gcc-4.9.4.tar.bz2
进入文件夹
cd gcc-4.9.4
下载依赖项,注意,要在gcc根目录执行
./contrib/download_prerequisites
如果连接失败,无法下载的话,就打开此文件,手动下载下面5个文件,然后将文件放在gcc根目录,再屏蔽contrib/download_prerequisites文件里面的wget操作,再重新执行一次./contrib/download_prerequisites。这样的话,后面编译gcc时,这几个依赖库会自动先编译,不用自动手动一个个编译。
cloog-0.18.1.tar.gz
gmp-4.3.2.tar.bz2
isl-0.12.2.tar.bz2
mpc-0.8.1.tar.gz
mpfr-2.4.2.tar.bz2
cd ..
mkdir build-gcc
创建与gcc根目录平级的临时目录
cd build-gcc
../gcc-4.9.4/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
./configure时遇到错误:
The following languages will be built: c,c++,fortran,java,lto,objc
*** This configuration is not supported in the following subdirectories:
gnattools target-libada target-libgo target-libbacktrace
(Any other directories should still work fine.)
checking for default BUILD_CONFIG... bootstrap-debug
checking for --enable-vtable-verify... no
/usr/bin/ld: crt1.o: No such file: No such file or directory
collect2: ld returned 1 exit status
configure: error: I suspect your system does not have 32-bit developement libraries (libc and headers).
If you have them, rerun configure with --enable-multilib.
If you do not have them, and want to build a 64-bit-only compiler, rerun configure with --disable-multilib.
解决:
系统没有32位开发支持库,可以运行:
yum install glibc-devel.i686
安装。
不过如果不需要编译32位程序,直接运行:
./configure --disable-multilib
即可。
gcc 编译配置参数说明:
–enable-languages //指定 gcc 能编译哪些语言的文件,每种语言用逗号分隔, 例如 c,c++,Java
–disable-multilib //默认gcc 能在32位系统上将代码编译成64位程序,或者在64位系统上编译成32位程序,如果加上这个编译选项则表示关闭这个gcc的交叉编译功能。
make -j 8
-j利用多核处理器加快速度,机器核数*2
make install
exportLD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64/:$LD_LIBRARY_PATH
exportC_INCLUDE_PATH=/usr/local/include/:$C_INCLUDE_PATH
exportCPLUS_INCLUDE_PATH=/usr/local/include/:$CPLUS_INCLUDE_PATH
gcc --version 或 g++ -version
当你在linux下写C/C++代码的时候,是不是会遇到许多编译链接的问题? 时不时报个glibc,gcc,g++等相关的错误? 很多时候都无从下手,而且比较混乱。 这也是编译链接过程中经常出现的问题。
从libc说起,libc是Linux下原来的标准C库,也就是当初写hello world时包含的头文件#include
后来libc逐渐被glibc取代,也就是传说中的GNU C Library。现在用的最多的是glibc,主流的一些linux操作系统如 Debian, Ubuntu,Redhat等用的都是glibc。
那glibc都做了些什么呢? glibc是Linux系统中最底层的API,几乎其它任何的运行库都要依赖glibc。 glibc最主要的功能就是对系统调用的封装,你想想看,你怎么能在C代码中直接用fopen函数就能打开文件? 打开文件最终还是要触发系统中的sys_open系统调用,而这中间的处理过程都是glibc来完成的。
那么,glibc是如何与上层应用程序和系统调用交互的呢?在以后的博客中再去探究吧。 除了封装系统调用,glibc自身也提供了一些上层应用函数必要的功能,如string,malloc,stdlib,linuxthreads,locale,signal等等。
你写的C代码在编译的过程中有可能出现明明是这些库里面定义的变,却量还会出现’Undefined’, ‘Unreference’等错误,这时候你可能会怀疑是不是这些库出问题了? 是不是该动手换个gilbc了? 这里强调一点,在你准备更换/升级这些库之前,你应该好好思考一下,你真的要更换/升级吗?你要知道你自己在做什么!你要时刻知道glibc的影响有多大,不管你之前部署的什么程序,linux系统的ls,cd,mv,ps等等全都得依赖它,很多人在更换/升级都有过惨痛的教训,甚至让整个系统奔溃无法启动。所以,强烈不建议更换/升级这些库!
当然如果你写的是C++代码,还有两个库也要非常重视了,libc++/libstdc++,这两个库有关系吗?有。两个都是C++标准库。libc++是针对clang编译器特别重写的C++标准库,那libstdc++自然就是gcc的事儿了。libstdc++与gcc的关系就像libc++与clang一样。
再说说libstdc++,glibc的关系。 libstdc++与gcc是捆绑在一起的,也就是说安装gcc的时候会把libstdc++装上。 那为什么glibc和gcc没有捆绑在一起呢?
相比glibc,libstdc++虽然提供了c++程序的标准库,但它并不与内核打交道。对于系统级别的事件,libstdc++首先是会与glibc交互,才能和内核通信。相比glibc来说,libstdc++就显得没那么基础了。
说完了这些库,这些库最终都是拿来干嘛的?当然是要将它们与你的程序链接在一起! 这时候就不得不说说gcc了。
你写的C代码.c文件通过gcc首先转化为汇编.S文件,之后汇编器as将.S文件转化为机器代码.o文件,生成的.o文件再与其它.o文件,或者之前提到的libc.so.6库文件通过ld链接器链接在一块生成可执行文件。当然,在你编译代码使用gcc的时候,gcc命令已经帮你把这些细节全部做好了。
那g++是做什么的? 慢慢说来,不要以为gcc只能编译C代码,g++只能编译c++代码。 后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。在编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,需要这样,gcc -lstdc++, 所以如果你的Makefile文件并没有手动加上libstdc++库,一般就会提示错误,要求你安装g++编译器了。