centos 7使用gcc编译c语言,CentOS 7编译安装gcc 4.9.4

1. 为什么要升级到gcc4.9.x呢?

因为最近在做的一个项目中要用C++11新特性,而在 g++ 4.9 之前,regex 库并不支持 ECMAScript 的正则语法,换句话说,在 g++4.9 之前,g++ 对 C++11 标准库的支持并不完善,为保证本次项目的顺利进行,故将 g++ 版本升级至 4.9 以上。

2. 不是g++,而是gcc?

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.

3. 安装过程:

3.1. 下载源码:

wget ftp://mirrors.kernel.org/gnu/gcc/gcc-4.9.4/gcc-4.9.4.tar.bz2

3.2. 解压文件:

tar -jxvf gcc-4.9.4.tar.bz2

3.3. 下载编译所需依赖项:

进入文件夹

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

3.4. 创建GCC临时编译目录:

cd ..

mkdir build-gcc

创建与gcc根目录平级的临时目录

3.5. 生成Makefile文件:

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的交叉编译功能。

3.6. 编译:

make -j 8

-j利用多核处理器加快速度,机器核数*2

3.7. 安装:

make install

3.8. 在~/.bash_profile配置库文件和头文件路径

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

3.9. 版本检查:

gcc --version 或 g++ -version

4. 理清gcc、g++、libc、glibc、libstdc++的关系

当你在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++编译器了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值