jinhailang / blog

技术博客:知其然,知其所以然
https://github.com/jinhailang/blog/issues
60 stars 6 forks source link

gcc 安装 #10

Open jinhailang opened 7 years ago

jinhailang commented 7 years ago

最近遇到在Linux下使用C++标准正则库报错,google发现是与gcc版本的问题,于是只好重新安装编译新的gcc,但是安装过程没有想象的那么简单,以下是遇到的各种坑: 注意:网上很多垃圾教程,很是误导人,就严格按照下面一步步来,不要试来试去,陷入各种奇怪错误陷阱,坑自己。

1)下载gcc源码,不多讲。

2)root权限切换到/opt目录下

cd /opt

解压gcc源码包到/opt目录下

tar xzvf gcc-4.8.2.tar.gz  
cd gcc-4.8.2

3)下载依赖包 gmp, mpfr, mpc

分别下载安装,很麻烦,很作死,不多讲。 执行下面的脚本自动下载关联依赖库

./contrib/download_prerequisites

4)新建一个文件,用来编译

一定要不要在那个gcc文件下直接编译,否则会报错,作死妥妥的

cd ..  
mkdir objdir  
mkdir /usr/local/gcc-4.9.1  
mkdir /usr/local/gcc  

5)编译gcc

cd objdir  
../gcc-4.9.1/configure --prefix=/usr/local/gcc-4.9.1 --exec-prefix=/usr/local/gcc --enable-languages=c,c++  
make  #很慢,大概要编译一个多小时

6)安装gcc

make install  

以上gcc就算是安装完了,但是要正常使用,还需要一些配置,一下配置方法引用自 http://ilovers.sinaapp.com/article/centos%E4%B8%8B%E5%AE%89%E8%A3%85gcc-481

make install 之后,会发现 /user/local/gcc 下放置的是 bin + lib 文件,/usr/local/gcc-4.8.1 下放置的是 include 文件。上面完事之后,就是删除原有的 gcc,替换成现在的最新版本;不过为了保险起见,还是将原有的 gcc 换成其他名字的好,比如 gcc-4.4.7/g++-4.4.7。关于后续的工作其实还有一些,主要是环境变量的设置,以及为 c++ 做的一些设置。

# 将 gcc/g++ 改名
$ mv /usr/bin/gcc /usr/bin/gcc-4.4.7
$ mv /usr/bin/g++ /usr/bin/g++-4.4.7

# 环境变量的设置
$ export PATH=/usr/local/gcc/bin:$PATH # 可以让 us 使用最新的 gcc/g++;
$ export LD_LIBRARY_PATH=/usr/local/lib # 这个可能不是必须的,对于 me 来说是必须的,设置的是 lib  的搜索 path;
$ ln -s /usr/local/gcc-4.8.1/include/c++/4.8.1 /usr/include/c++/4.8.1 # 在 include/c++ 文件夹下添加最新的 c++ 4.8.1 版本(这是个符号链接);
$ export C_INCLUDE_PATH=/usr/include # 这个是多余的,实际上不用设置;
$ export CPLUS_INCLUDE_PATH=/usr/include/c++/4.8.1:/usr/include/c++/4.8.1/x86_64-unknown-linux-gnu # c++ include 搜索目录,这里有两个,使用的 : 隔开;

有个问题是,在 shell 中通过 export 设置的环境变量不是持久有效的,在用户退出登录之后就不再有效,可以将 export 的环境变量在用户主目录下的 .bash_profile 中设置,对用户来说,是持久有效的;如果想对对所有的用户有效,需要 root 在 /etc/profile 中设置;

安装可能出现的问题以及方案

configure 步骤提示找不到 gmp、mpfr 等 lib 或是 header;缺少的要安装,可以使用自带的包管理器,比如 yum install gmp,也可以从官网下载安装,下载地址:
GMP:http://gmplib.org
MPFR:http://www.mpfr.org
MPC:http://www.multiprecison.org
ISL+CLooG:ftp://gcc.gnu.org/pub/gcc/infrastructure
ISL 明明已经安装了,然而 configure 检测 no !设置环境变量 $ export LD_LIBRARY_PATH=/usr/local/lib (这是 isl lib 所在的目录,当然 u 的可能不一样);
stubs-32.h 找不到,安装 32 位的 glibc-devel;
编译 c++ 发现找不到 c++config.h;本来 c++ include 目录是 /usr/include/c++/4.8.1,c++config.h 位于其下的 x86_64-unknown-linux-gnu (这个文件夹跟平台有关)下,所以可以在 CPLUS_INCLUDE_PATH 中设置;
环境变量设置只在 shell 中有效,退出之后就不再有效;修改 ~/.bash_profile 文件,在其中添加环境变量(需要退出登陆有效);
测试

编译一下 hello.cpp,使用了 c++11 的一些特性,比如初始化方式,类型推断以及新的 for 用法,$ g++ -std=c++11 hello.cpp :

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
        vector<int> v = {2, 4, 8, 3, 5, 6, 1, 7, 10, 9};

        sort(v.begin(), v.end());

        for(auto i: v)
                cout << i << " ";
        cout << endl;

        return 0;
}

以上。