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这样最好,不会有太多的什么依赖问题、版本兼容问题。。。
- gcc和boost的升级步骤(非root权限)
- #GCC#root 权限的获得
- centos中gcc升级,boost升级
- LINUX下非交互加入root权限用户和修改密码的python小程序
- LINUX下非交互加入root权限用户和修改密码的python小程序
- CentOS gcc升级4.8步骤
- 【Android】实现非root的 Traceroute -- 非Root权限下移植可执行二进制文件 脚本文件
- Android 上实现非root的 Traceroute -- 非Root权限下移植可执行二进制文件 脚本文件
- 非root权限安装软件
- CentOS 升级 gcc 和 g++ 的方法
- CentOS 升级 gcc 和 g++ 的方法
- linux下非root权限的mysql安装
- python在非root权限下的安装
- 忘记root密码和第一次登录root的方法步骤
- 忘记root密码和第一次登录root的方法步骤
- 非root用户安装gcc-4.9.4
- 那些没有root权限的岁月:step by step-无ROOT权限下使用GCC编译python
- root用户和sudo使用root权限的区别
- java反射操作类的方法
- 程序员必看的书
- php程序员为何跳槽这么频繁?
- struts2 关于 No result defined for action and result success 的问题
- 代码重构 -- 思路和方法
- gcc和boost的升级步骤(非root权限)
- Service 绑定
- 开博记录
- 零学习opencl
- 第一篇博客
- Struts Logic标签
- ffmpeg教程
- Web Service单元测试工具实例介绍之SoapUI
- MACBOOK AIR 启动工具盘的制作