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

  • Post author:
  • Post category:其他


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



版权声明:本文为u010246947原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。