由于单位的开发机为多人共用,即home目录下每人有自己单独目录和空间,每人均没有root权限,而使用的公共的安装在系统目录的gcc版本过低(3.4.5),boost同样是安装在系统目录下版本为1.32,当需要一些高版本boost才有的功能时(因需要regex库,1.32的boost没有),所以需要升级boost,而高版本boost(1.54)在编译过程中,因gcc版本过低导致很多boost源程序无法编译成功(如thread等重要的boost库),所以需要先升级gcc,再升级boost。
    我没有root权限,所以无法使用yum自动下载安装好的包,必须得自行安装,下面是全部的安装步骤:
    
   
1、安装gcc:
1.1、升级gcc依赖的:mpfr-3.1.0、gmp-5.0.1、mpc-0.9
    gcc升级需要升级这三个软件的版本,上面的版本是可以支持我现在使用的gcc 4.5.1的升级,三个软件链接如下:
    
    http://www.multiprecision.org/mpc/download/mpc-0.9.tar.gz
   
ftp://ftp.gnu.org/gnu/gmp/gmp-5.0.1.tar.bz2
http://ftp.gnu.org/gnu/mpfr/mpfr-3.1.0.tar.xz
    1.1.1、xz安装
    
   
    注意,mpfr那个软件下载下来是个tar.xz的压缩格式,需要先解压成tar,需要使用xz软件,这个机器系统目录里没有也需要下载,软件链接如下:
    
    http://tukaani.org/xz/xz-4.999.9beta.tar.bz2
   
首先解压:bzcat xz-4.999.9beta.tar.bz2 | tar xvf -,解压后进入目录安装,我没有root无法安装软件在系统目录,需要指定prefix,步骤为:./configure –prefix=/home/users/liudong09/ld_xz/ &&make &&make install
安装好了xz后,给自己加个命令吧,alias xz=‘/home/users/liudong09/ld_xz/bin/xz’
然后就可以解压tar.xz后缀的mpfr压缩包文件,xz -d mpfr-3.1.0.tar.xz,解压成了.tar文件;
    1.1.2、安装mpfr-3.1.0、gmp-5.0.1、mpc-0.9
    
   
下面开始安装这三个依赖;
必须先安装gmp,以为后面两个依赖它,还是要指定安装目录,../gmp-5.0.1/configure –prefix=/home/users/liudong09/ld_gmp-5.0.1/ && make && make install
    然后是mpfr,它依赖gmp,同样指定安装目录,./configure –prefix=/home/users/liudong09/ld_mpfr_3.1.0/ –with-gmp=/home/users/liudong09/ld_gmp-5.0.1/ && make && make install
    
   
最后是mpc,它依赖前面两个,同样指定安装目录,./configure –prefix=/home/users/liudong09/ld_mpc_0.9/ –with-gmp=/home/users/liudong09/ld_gmp-5.0.1/ –with-mpfr=/home/users/liudong09/ld_mpfr_3.1.0/ && make && make install
1.2、安装gcc-4.5.1:
下载gcc4.5.1:wget http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/gcc-4.5.1.tar.bz2
然后解压:bzcat gcc-4.5.1.tar.bz2 | tar xvf –
然后是configure:./configure –prefix=/home/users/liudong09/ld_gcc_4.5.1/ –enable-threads=posix –disable-checking –enable-language=c,c++ –with-gmp=/home/users/liudong09/ld_gmp-5.0.1/ –with-mpfr=/home/users/liudong09/ld_mpfr_3.1.0/ –with-mpc=/home/users/liudong09/ld_mpc_0.9/
指定安装目录、依赖的那三个软件的目录、还有一些是网上抄的
然后是make,make前提是本身要有一个gcc,另外make时注意存储空间得够,否则半截可能出现因为空间不够而编译中止;
最后是make install,将是很长的一段时间,我感觉得两三个小时貌似
此时新的gcc安装好了但还没法用,需要改自己的环境变量,修改~/.bash_profile:
    export PATH=/home/users/liudong09/ld_gcc_4.5.1/bin:/home/users/liudong09/ld_gcc_4.5.1/lib64:$PATH
    
    export LD_LIBRARY_PATH=/home/users/liudong09/ld_gcc_4.5.1/lib/:/home/users/liudong09/ldboost/boost_1_54_0/ldboost154/lib:/home/users/liudong09/ld_xz/bin:/home/users/liudong09/ld_gmp-5.0.1/lib:/home/users/liudong09/ld_mpc_0.9/lib:/home/users/liudong09/ld_mpfr_3.1.0/lib:$LD_LIBRARY_PATH
   
一定把新的gcc目录的bin、lib64放在$PATH的前面,这样调用gcc会优先找到我们的新的gcc,而不是系统目录的旧gcc
另外运行时库的环境变量LD_LIBRARY_PATH也一定要改,方式也是一定放在原先变量$LD_LIBRARY_PATH前面
这时,gcc -v,就可以看到,不再是3.4.5了,而是4.5.1!!!
但是此时,编译复杂一点的应用程序时还是要注意加链接优先目录的编译选项‘-Wl,-rpath’,强行让应用程序在找libstdc++.so时,找我们的新的gcc的这个库文件,否则会出现运行时报错“GLIBCXX的版本低”的错误,
    ./myreg
    
    ./myreg: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9′ not found (required by ./myreg)
    
    ./myreg: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9′ not found (required by /home/users/liudong09/ldboost/boost_1_54_0/ldboost154/lib/libboost_thread.so.1.54.0)
   
通过ldd 查看:
    ldd myreg
    
    ./myreg: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9′ not found (required by ./myreg)
    
    ./myreg: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9′ not found (required by /home/users/liudong09/ldboost/boost_1_54_0/ldboost154/lib/libboost_thread.so.1.54.0)
    
    libboost_system.so.1.54.0 => /home/users/liudong09/ldboost/boost_1_54_0/ldboost154/lib/libboost_system.so.1.54.0 (0x00007f3770a73000)
    
    libboost_thread.so.1.54.0 => /home/users/liudong09/ldboost/boost_1_54_0/ldboost154/lib/libboost_thread.so.1.54.0 (0x00007f3770955000)
    
    libpthread.so.0 => /lib64/tls/libpthread.so.0 (0x0000003f0b900000)
    
    libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003f0bf00000)
    
    libm.so.6 => /lib64/tls/libm.so.6 (0x0000003f0b500000)
    
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003f0c300000)
    
    libc.so.6 => /lib64/tls/libc.so.6 (0x0000003f0b000000)
    
    librt.so.1 => /lib64/tls/librt.so.1 (0x00007f3770822000)
    
    /lib64/ld-linux-x86-64.so.2 (0x0000003f0ae00000)
    
   
它还在找系统目录下的:libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003f0bf00000)
问题出在:这个什么GLIBCXX的支持版本不够多:
    通过这样查看:strings /usr/lib64/libstdc++.so.6 | grep GLIBC
    
    GLIBCXX_3.4
    
    GLIBCXX_3.4.1
    
    GLIBCXX_3.4.2
    
    GLIBCXX_3.4.3
    
    GLIBC_2.3
    
    GLIBC_2.2.5
    
    GLIBCXX_FORCE_NEW
   
果然没有3.4.9的那个要求的版本
    而新安装的gcc 4.5.1,则可以满足要求:strings /home/users/liudong09/ld_gcc_4.5.1/lib64/libstdc++.so.6 | grep GLIBC
    
    GLIBCXX_3.4
    
    GLIBCXX_3.4.1
    
    GLIBCXX_3.4.2
    
    GLIBCXX_3.4.3
    
    GLIBCXX_3.4.4
    
    GLIBCXX_3.4.5
    
    GLIBCXX_3.4.6
    
    GLIBCXX_3.4.7
    
    GLIBCXX_3.4.8
    
    GLIBCXX_3.4.9
    
    GLIBCXX_3.4.10
    
    GLIBCXX_3.4.11
    
    GLIBCXX_3.4.12
    
    GLIBCXX_3.4.13
    
    GLIBCXX_3.4.14
    
    GLIBC_2.2.5
    
    GLIBC_2.3
    
    GLIBC_2.3.2
    
    GLIBCXX_FORCE_NEW
    
    GLIBCXX_DEBUG_MESSAGE_LENGTH
    
   
所以必须设置应用程序不能再去找旧的库/usr/lib64/libstdc++.so.6了,故需要在makefile中加入-Wl,-rpath的选项,强制优先链接自己的库目录,makefile举例如下:
CC_FLAG:=-Wall -g $(CC_INCLUDE) -Wl,-rpath=/home/users/liudong09/ld_gcc_4.5.1/lib64 $(LD) $(LIB)
    $(all):
    
    $(CC) $(CC_FLAG) $(src) -o $@
   
    此时就ok了:ldd myreg
    
    libstdc++.so.6 => /home/users/liudong09/ld_gcc_4.5.1/lib64/libstdc++.so.6 (0x00007fcafeea1000)
    
    libboost_system.so.1.54.0 => /home/users/liudong09/ldboost/boost_1_54_0/ldboost154/lib/libboost_system.so.1.54.0 (0x00007fcafed9d000)
    
    libboost_thread.so.1.54.0 => /home/users/liudong09/ldboost/boost_1_54_0/ldboost154/lib/libboost_thread.so.1.54.0 (0x00007fcafec80000)
    
    libpthread.so.0 => /lib64/tls/libpthread.so.0 (0x0000003f0b900000)
    
    libm.so.6 => /lib64/tls/libm.so.6 (0x0000003f0b500000)
    
    libgcc_s.so.1 => /home/users/liudong09/ld_gcc_4.5.1/lib64/libgcc_s.so.1 (0x00007fcafeb53000)
    
    libc.so.6 => /lib64/tls/libc.so.6 (0x0000003f0b000000)
    
    librt.so.1 => /lib64/tls/librt.so.1 (0x0000003f0c300000)
    
    /lib64/ld-linux-x86-64.so.2 (0x0000003f0ae00000)
    
   
这个非常的重要,否则调用boost的thread库libboost_thread.so的应用程序,编译没问题,但是在运行时会报错“GLIBCXX的版本低”的错误!
    但事实上这样做会产生一种不兼容,因为在这个机器上这样编译出来的程序,在其他机器可能无法运行,还需要改makefile。。。。。
    
   
2、安装boost-1.54:
首先还是下载:boost我是从csdn的一个人的资源中下载的,好像是0分的~~
然后是解压;
    然后是进入目录,执行bootstrap.sh
    
   
执行完了之后,执行bjam ,设置安装目录、存储头文件的目录、存储库文件的目录:./bjam –prefix=XXX –includedir=YYY –libdir=ZZZ install
编译安装之后,我觉得比较重要的是,进到自己指定的libdir即安装库文件的目录看一看,诸如boost_system、boost_thread之类的库,是否安装成功了,这些很重要
安装之后了,设置环境变量:
    export PATH=/home/users/liudong09/ld_gcc_4.5.1/bin:/home/users/liudong09/ld_gcc_4.5.1/lib64:$PATH
    
    export LD_LIBRARY_PATH=/home/users/liudong09/ld_gcc_4.5.1/lib/:/home/users/liudong09/ldboost/boost_1_54_0/ldboost154/lib:/home/users/liudong09/ld_xz/bin:/home/users/liudong09/ld_gmp-5.0.1/lib:/home/users/liudong09/ld_mpc_0.9/lib:/home/users/liudong09/ld_mpfr_3.1.0/lib:$LD_LIBRARY_PATH
   
记得要source
    有时候环境变量还是会被修改(不知道为什么),所以比较好的办法是在自己源程序的makefile中,指定boost的头文件、库文件的目录吧
    
   
最后,附带一个makefile和测试程序吧:
makefile:
    make myreg
    
    /usr/bin/make64 MAC=64 myreg
    
    g++ -Wall -g -I/home/users/liudong09/ldboost/boost_1_54_0/ldboost154/inc/boost -I/home/users/liudong09/ldboost/boost_1_54_0/ldboost154/inc -Wl,-rpath=/home/users/liudong09/ldboost/boost_1_54_0/ldboost154/lib -Wl,-rpath=/home/users/liudong09/ld_gcc_4.5.1/lib64 -L/home/users/liudong09/ldboost/boost_1_54_0/ldboost154/lib -L/home/users/liudong09/ld_gcc_4.5.1/lib64 -lstdc++ -lboost_system -lboost_thread -lpthread test.cpp -o myreg
    
    cat Makefile
    
    boostdir:=/home/users/liudong09/ldboost/boost_1_54_0/ldboost154/inc/boost /home/users/liudong09/ldboost/boost_1_54_0/ldboost154/inc
    
    boostlibdir:=/home/users/liudong09/ldboost/boost_1_54_0/ldboost154/lib
    
    gcclibdir:=/home/users/liudong09/ld_gcc_4.5.1/lib64
    INCDIR:=$(boostdir)
    
    LIBDIR:=$(boostlibdir) $(gcclibdir)
    
    LIB:=-lstdc++ -lboost_system -lboost_thread -lpthread
    CC:=g++
    
    CC_INCLUDE:=$(addprefix -I,$(INCDIR))
    
    LD:=$(addprefix -L,$(LIBDIR))
    
    CC_FLAG:=-Wall -g $(CC_INCLUDE) -Wl,-rpath=/home/users/liudong09/ldboost/boost_1_54_0/ldboost154/lib -Wl,-rpath=/home/users/liudong09/ld_gcc_4.5.1/lib64 $(LD) $(LIB)
    all=myreg
    
    src=test.cpp
    $(all):
    
    $(CC) $(CC_FLAG) $(src) -o $@
    .PHONY:clean
    
    clean:
    
    rm -f $(all)
   
源文件:
    #include <iostream>
    
    #include <string>
    
    #include <vector>
    
    #include <map>
    #define BOOST_DATE_TIME_SOURCE
    
    #define BOOST_THREAD_USE_LIB
    
    #include “thread.hpp”
    
    #include “thread/thread.hpp”
    
    using namespace std;
    
    using namespace boost;
    ///1. mutex
    
    ///mutex m;
    
    ///mutex::scoped_lock lock(m);
    
    ///do sth.
    
    template <class T>
    
    class myatom : boost::noncopyable {
    
    
    T cnt;
    
    mutex mux;
    
    public:
    
    myatom (T input = T()):cnt(input) {}
    
    T operator++ () {
    
    
    mutex::scoped_lock lock(mux);
    
    return ++cnt;
    
    }
    
    operator T() {return cnt;}
    
    };
    void thread_test1 () {
    
    
    cout<<“adsfas”<<endl;
    
    }
    int main () {
    
    
    ///1. mutex
    
    typedef class myatom<int> myatom_t_int;
    
    myatom_t_int myatom_1(1);
    
    cout<<“atom ++ = “<<++myatom_1<<endl;
    //cout<<“concurrency: “<<thread::hardware_concurrency()<<endl;
    
    thread a(&thread_test1);
    a.join();
    
    return 0;
    
    }
   
make成功,可以正常运行。
    很费劲,最好还是有root权限,直接yum/apt-get这样最好,不会有太多的什么依赖问题、版本兼容问题。。。
    
   
 
