gcc和boost的升级步骤(非root权限)

来源:互联网 发布:默默西风淘宝店 编辑:程序博客网 时间:2024/05/17 09:32

由于单位的开发机为多人共用,即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这样最好,不会有太多的什么依赖问题、版本兼容问题。。。

0 0
原创粉丝点击