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

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。   可从http://sourceforge.net/project/showfiles.php?group_id=7586下载安装boost库。大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库。里面有许多具有工业强度的库,如graph库。   Boost中比较有名气的有这么几个库:   Regex   正则表达式库   Spirit   LL parser framework,用C++代码直接表达EBNF   Graph   图组件和算法   Lambda   在调用的地方定义短小匿名的函数对象,很实用的functional功能   concept check   检查泛型编程中的concept   Mpl   用模板实现的元编程框架   Thread   可移植的C++多线程库   Python   把C++类和函数映射到Python之中   Pool   内存池管理   smart_ptr   5个智能指针,学习智能指针必读,一份不错的参考是来自CUJ的文章:   Smart Pointers in Boost,哦,这篇文章可以查到,CUJ是提供在线浏览的。中文版见笔者在《Dr.Dobb's Journal软件研发杂志》第7辑上的译文。   Boost总体来说是实用价值很高,质量很高的库。并且由于其对跨平台的强调,对标准C++的强调,是编写平台无关,现代C++的开发者必备的工具。但是Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。并且很多Boost中的库功能堪称对语言功能的扩展,其构造用尽精巧的手法,不要贸然的花费时间研读。Boost另外一面,比如Graph这样的库则是具有工业强度,结构良好,常值得研读的精品代码,并且也可以放心的在产品代码中多多利用。   boost英文解释:推进   boost 在一些播放软件和音效中指增强,比如Bass Boost,低音增强。 提示: 这是boostpro定制安装更新版, 可以选择自己需要的库. 包括1.33到1.40所有版本. 如要最新可去http://www.boostpro.com/
如果你没有C compiler和root权限,你可能无法直接安装gcc。但是,你可以尝试以下方法: 1. 使用包管理器安装gcc:如果你使用的是Linux或类Unix操作系统,并且有一个包管理器,你可以尝试使用它来安装gcc。例如,在Ubuntu上,你可以使用以下命令安装gcc: ``` sudo apt-get update sudo apt-get install gcc ``` 如果你没有root权限,你可以尝试使用`--user`选项进行用户级别安装: ``` sudo apt-get update sudo apt-get install gcc --user ``` 请注意,这种方法可能需要一些时间,因为它需要从软件仓库中下载gcc并安装。 2. 在线安装:如果你无法使用包管理器安装gcc,你可以尝试在线安装。你可以从gcc官方网站下载gcc的源代码,并按照它们的说明进行编译和安装。这需要一些时间和技能,因为你需要手动解决依赖关系和编译问题。 3. 使用Docker:如果你无法在本地安装gcc,你可以尝试使用Docker来运行一个包含gcc的容器。Docker是一个虚拟化平台,可以让你在你的计算机上运行容器化的应用程序。你可以从Docker Hub上下载一个包含gcc的镜像,并在容器中运行它。这需要一些时间和技能,因为你需要学习如何使用Docker和管理容器。 请注意,这些方法都需要一些技能和经验,并且可能需要一些时间和努力。如果你不确定如何做,最好联系你的系统管理员或技术支持人员以获取帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值