博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编译Boost——Linux
阅读量:7178 次
发布时间:2019-06-29

本文共 4177 字,大约阅读时间需要 13 分钟。

相对于Windows来,Linux下的boost编译简单至极。没有那么多的可选编译器,没有那长的编译时间,没有那么多的硬盘使用量,统一的inlude和lib目录,你熟悉命令行,不使用IDE,不需要我那么罗嗦的介绍怎么配置EditPlus。


首先是下载boost,可以在此
http://sourceforge.net/projects/boost
寻找一个合适的版本。比如我下载的是boost_1_33_1.tar.gz,解压到/opt。


tar xzvf boost_1_33_1.tar.gz -C/opt

提醒:做这些事情的时候你需要有root权限。


进入boost目录:


cd /opt/boost_1_33_1

首先我们要编译bjam:


cd tools/build/jam_src/ ./build.sh

很快编译结束,默认情况下,bjam会被复制到/usr/local/bin/bjam。


现在你可以使用bjam编译boost了。


cd ../../.. bjam -sTOOLS=gcc install

编译时间不会如windows那么长久,在我的电脑上编译了大约40分钟。你可以在前后使用df命令检查下磁盘使用,在我的电脑上,编译boost花费了500M的空间。


使用install会把头文件复制到/usr/local/include/boost-1_33_1中,把生成的lib复制到/usr/local/lib中。这些完成之后,记得要使用ldconfig来更新动态链接库。


在测试两个例子之前,我们先设置几个环境变量。


BOOST_ROOT=/opt/boost_1_33_1 BOOST_INCLUDE=/usr/local/include/boost-1_33_1 BOOST_LIB=/usr/local/lib

为了使其能够在登录时自动导入,你可以写一个脚本:

 
None.gif
#
!/bin/sh#boost settings
None.gif
BOOST_ROOT=/opt/boost_1_33_1
None.gifBOOST_INCLUDE=/usr/
local/include/boost-1_33_1
None.gifBOOST_LIB=/usr/
local/lib
  export BOOST_ROOT BOOST_INCLUDE BOOST_LIB

将其保存为/etc/profile.d/boost.sh,并使用chmod a+x boost.sh设置执行权限。


现在我们可以写两段代码来测试了。


第一个测试文件是lex.cpp:

 
None.gif#include <boost/lexical_cast.hpp>
None.gif#include <iostream>
None.gif
int main()
ExpandedBlockStart.gif
InBlock.gif   
using boost::lexical_cast;
InBlock.gif    
int a = lexical_cast<
int>("123");
InBlock.gif    
double b = lexical_cast<
double>("123.12");
InBlock.gif    std::cout<<a<<std::endl;
InBlock.gif    std::cout<<b<<std::endl;
InBlock.gif    
return 0;
ExpandedBlockEnd.gif}
编译:

g++ lex.cpp -I$BOOST_ROOT -o lex

运行:

./lex

输出:

123 123.12

你可以将$BOOST_ROOT改为$BOOST_INCLUDE,如果你没有设置环境变量,可以改为/opt/boost_1_33_1或者/usr/local/include/boost-1_33_1。


我们的第二个例子是re.cpp:


 
None.gif#include <iostream>
None.gif#include <
string>
None.gif#include <boost/regex.hpp>
None.gif
int main()
ExpandedBlockStart.gif  {
InBlock.gif   std::
string s = "who,lives:in-a,pineapple    under the sea?";
InBlock.gif   boost::regex re(",|:|-|\\s+");
InBlock.gif   boost::sregex_token_iterator
InBlock.gif     p(s.begin( ), s.end( ), re, -1);
InBlock.gif   boost::sregex_token_iterator end;
InBlock.gif   
while (p != end)
InBlock.gif      std::cout << *p++ << '\n';
ExpandedBlockEnd.gif}

编译:

g++ re.cpp -I$BOOST_ROOT -lboost_regex-gcc -o re

运行:

./re

输出:

who lives in a pineapple under the sea?

这里要使用-l指定了链接库。


现在boost的基本安装配置已经完成,但是我们可以再改进下。


如果不想每次都指定boost头文件目录,可以将其link到/usr/include中:


ln -s /opt/boost_1_33_1/boost /usr/include/boost

或者:


ln -s /usr/local/include/boost-1_33_1/boost /usr/include/boost

如果你依然嫌boost编译后占用的空间太大,可以在boost目录下使用bjam clean:

cd /opt/boost_1_33_1 bjam -sTOOLS=gcc clean

这个命令会清除编译时的中间文件,/usr/local/lib下带版本号的boost libs,和/usr/local/include下的boost头文件。但是同时节省了几百M的硬盘空间。


所以如果你使用了clean,记得将BOOST_INCLUDE更为BOOST_ROOT(/opt/boost_1_33_1),将 /usr/include/boost link到/opt/boost_1_33_1/boost,再有就是编译链接时的boost lib不要带版本号。


如果你觉得编译时手动链接敲那么长的名字比较麻烦,可以使用脚本来自动寻找链接:


 
None.gif
#
!/usr/bin/python
None.gif
import os
None.gif
import sys
None.gif
import re
None.gifBOOST_ROOT = os.getenv(
'
BOOST_ROOT
')
None.gifBOOST_LIB = os.getenv(
'
BOOST_LIB
')
None.gif
#
BOOST_ROOT = '/opt/boost_1_33_1'
None.gif#
BOOST_LIB = '/usr/local/lib'
None.gif
def getlibs():
None.gif    alls = os.listdir(BOOST_LIB)
None.gif    libpattern = re.compile(r
'
^libboost_([^-]+)-gcc
')
None.gif    libs = {}
None.gif    
for lib 
in alls:
None.gif        m = libpattern.match(lib)
None.gif        
if m:
None.gif            libs[m.group(1).lower()] = 1
None.gif    
return libs
None.gifpattern = re.compile(r
'
^\s*#include\s*<\s*boost/(.+)\.(h|hpp)\s*>
')
None.giflibs = getlibs()
None.giflibskeys = libs.keys()
None.gifincludes = {}
None.gifENV = os.environ
None.gifARGV = sys.argv[1:]
None.giffiles = ARGV
None.gif
if len(files) == 0: 
None.gif   sys.exit()
None.gif
for f 
in files:
None.gif    
if f.lower().endswith(
'
.cpp
'):
None.gif        fp = open(f, 
'
r
')
None.gif        lines = fp.readlines()
None.gif        
for ln 
in lines:
None.gif            m = pattern.match(ln)
None.gif            
if m:
None.gif                libname = m.group(1).lower()
None.gif                
if libname 
in libskeys:
None.gif                    includes[libname] = 1
None.giflibline = 
'
 
'.join(map(
lambda lib: 
'
-lboost_
'+lib+
'
-gcc
', includes.keys()))
None.gifobj = ARGV[0]
None.gifobj = obj[:len(obj)-4]
None.gif
#
cmd = 'g++ %s -I%s %s -o %s' % (' '.join(files), BOOST_ROOT, libline, obj)
None.gif
cmd = 
'
g++ %s %s -o %s
' % (
'
 
'.join(files), libline, obj)
None.gif
print cmd
None.gifos.system(cmd)

将这段代码写进/usr/local/bin/gccboost,赋予执行权限。


使用方法:

gccboost lex.cpp gccboost re.cpp

注意:使用此命令假设boost头文件在/usr/include中,如果假设不成立,请自行修改脚本此行:

cmd = 'g++ %s %s -o %s' % (' '.join(files), libline, obj)

为之前的注释行:

cmd = 'g++ %s -I%s %s -o %s' % (' '.join(files), BOOST_ROOT, libline, obj)

如若BOOST_ROOT和BOOST_LIB环境变量不存在,修改下面两行代码:

BOOST_ROOT = os.getenv('BOOST_ROOT') BOOST_LIB = os.getenv('BOOST_LIB')

为之后注释行:

BOOST_ROOT = '/opt/boost_1_33_1' BOOST_LIB = '/usr/local/lib'

另外,gccboost将会自动修改输出的文件名为*.cpp的文件名(如lex.cpp将输出lex),如果不需要,请将下面的代码:

cmd = 'g++ %s %s -o %s' % (' '.join(files), libline, obj)

改为:

cmd = 'g++ %s %s' % (' '.join(files), libline)

转载地址:http://ttlzm.baihongyu.com/

你可能感兴趣的文章
scp免密码登陆进行远程文件同步
查看>>
FMDB 直接将查询结果转化为字典
查看>>
李超线段树学习笔记
查看>>
mac相关
查看>>
GVRP
查看>>
zabbix_agent安装
查看>>
Ubuntu12.10下Vsftpd的安装
查看>>
CF679E Bear and Bad Powers of 42
查看>>
Python学习之一:Python2.7与opencv2.4安装配置
查看>>
CI工具和产品资源
查看>>
小米5如何支持AT&T网络运营商
查看>>
单元测试系列之六:JUnit5 技术前瞻
查看>>
20172303 2017-2018-2 《程序设计与数据结构》实验三报告
查看>>
Python中IO编程-StringIO和BytesIO
查看>>
禁止ViewState的3种解决方法
查看>>
JVM程序计数器
查看>>
百度人脸识别结构光活体检测功能
查看>>
Django_rbac_demo 权限控制组件框架模型
查看>>
HTTPserver v3.0 版本项目
查看>>
unknown error: call function result missing 'value'
查看>>