现在的位置: 首页 > 综合 > 正文

boost库开发简介

2013年01月30日 ⁄ 综合 ⁄ 共 5355字 ⁄ 字号 评论关闭

【简介】
Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。Boost库由C++标准委员会库工作组成

员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。Boost由于其对跨平台的强调

,对标准C++的强调,与编写平台无关。大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需

要链接库。但Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。
【安装】
boost编译步骤
1)编译bjam工具
到boost安装路径目录下,
windows:运行bootstrap.bat,编译bjam
linux:运行./build.sh

2)配置相关文件(可选)
bjam编译工具无法找到编译器,需要设置boost-build相关文件:
  配置文件为$BOOST_ROOT\tools\build\v2\user-config.jam
    
VC编译器,可以进行如下设置:
using msvc : 7.1 : "C:/Program Files/Microsoft Visual Studio .NET2003/Vc7/bin/cl" ;
针对gcc编译器,可以进行如下设置:
using gcc : 4.3 : d:\\dev\\gcc\\bin\\gcc.exe ;
如bjam可以找到编译器,需指定编译器,设置如下:
       using msvc ;
     
       using gcc ;

3)编译boost库
在boost目录下,运行bjam 即可编译全部的boost库,这个过程需要的时间比较长,一般建议只编译自己需要的库文件,通过bjam--show

-libraries 即可查看
找到需要编译的boost库名,按照需要编译所需的boost库:
例如编译serialization序列化库,
windows上编译静态多线程debug版本库:
bjam --toolset=msvc link=static runtime-link=static threading=multistage debug --with-serialization
编译生成文件统一在boost目录下stage\libs中
Linux上编译并安装:
./bjam --includedir=/usr/local/include --libdir=/usr/local/lib--with-serialization install
./bjam --toolset=gcc --includedir=/usr/local/include--libdir=/usr/local/lib --with-regex install

【使用】
1. 仅使用boost提供的头文件 lex.cpp:
-----------------------lex.cpp开始--------------------------------
#include<boost/lexical_cast.hpp>
#include <iostream>
using boost::lexical_cast;

intmain(){   
       
   int a =lexical_cast<int>("123");   
   double b =lexical_cast<double>("123.12");   
   std::cout<<a<<std::endl;       std::cout<<b<<std::endl;   
   return 0;
}
-----------------------lex.cpp结束--------------------------------
g++ lex.cpp -I/usr/local/include -o lex

2. 使用regex库
-----------------------rex.cpp开始--------------------------------
#include <iostream>
#include <string>
#include <boost/regex.hpp>
int main(){  
 std::string s ="who,lives:in-a,pineapple   under thesea?";  
 boost::regexre(",|:|-|\\s+");  
 boost::sregex_token_iterator p(s.begin( ),s.end( ), re,-1);  
 boost::sregex_token_iteratorend;  
 while (p !=end)     
  std::cout<< *p++<< '\n';

 return 0;

}

-----------------------rex.cpp结束--------------------------------
g++ rex.cpp -I/usr/local/include -lboost_regex -o re

3. 使用boost_serialization序列化库
-----------------------ser.cpp开始--------------------------------
#include <sstream>
#include <iostream>
#include <string>

#include<boost/archive/text_oarchive.hpp>
#include<boost/archive/text_iarchive.hpp>

#include<boost/archive/binary_iarchive.hpp>
#include<boost/archive/binary_oarchive.hpp>
#include<boost/serialization/utility.hpp>
using namespace std;

class Data
{
 friend classboost::serialization::access;
 long long m_data;
 template <classArchive>

  voidserialize( Archive& ar, const unsigned int version)
 {
  ar& m_data;
 };

public:
 Data() : m_data( 0 ) {};
 const long long &getData() const { return m_data; };
 void setData( long long val ){ m_data =val; }
};

class person
{
public:
 person()
 {
 }

 person(int age, char sex)
  :age_(age),sex_(sex)
 {
 }

 int age() const
 {
  returnage_;
 }

private:
 friend classboost::serialization::access;

 template <typenameArchive>
  voidserialize(Archive &ar, const unsigned intversion)
 {
  ar& age_;
  ar& sex_;

 }

 int age_;
 int sex_;

};

std::stringstream ss;
void save()
{
 
 boost::archive::text_oarchiveoa(ss);
 int i = 1;
 person p(31,1);
   string strVal = "heha";
 oa <<i<<strVal<<p;
 cout<<"saved:"<<ss.str().c_str()<<"size:"<<ss.str().size()<<endl;
}

void load()
{
 std::stringstream ss1;
 ss1.str(ss.str());
 boost::archive::text_iarchiveia(ss1);
 std::string strVal;
 int i = 0;
 person p;

 ia >>i>>strVal>>p;
 ss1>>i>>strVal;
// cout<<ss1.str().c_str()<<std::endl;
 std::cout<<"load:"<<"i:"<<i<<"strVal:"<<strVal<<std::endl;
 std::cout<<"age:"<<p.age() << std::endl;
}

int main()
{
 // 序列化对象
 ostringstream oss;
 boost::archive::binary_oarchive oar( oss);
 Data data;
 const Data& data_freeze =const_cast<Data&>(data );
 data.setData( 1000000 );
 oar <<data_freeze;
 data.setData( 4000000 );
 oar <<data_freeze;
 cout <<"serialize: len:" << oss.str().size()<<"\n   data:"<< oss.str()<< endl;

 // 反序列化
 istringstream iss( oss.str() );
 boost::archive::binary_iarchive iar( iss);
 Data data1;
 iar >>data1;
 cout <<"data: " << data1.getData()<< endl;
 iar >>data1;
 cout <<"data: " << data1.getData()<< endl;

 // 序列化对象
 save();
 // 反序列化
 load();

 return 0;
}

-----------------------ser.cpp结束--------------------------------

g++ ser.cpp -I/usr/local/include -lboost_serialization -oser

<!运行注意点!>
1)Windows的Visual Studio 环境需要设置开启RTTI功能
工程属性->C/C++选项卡->语言->启用运行时类型信息选择"是(/GR)"

2)linux动态链接库路径需要配置
#vim /etc/ld.so.conf
加入 /usr/local/lib
#ldconfig

【参考资料】
【参考资料】
boost自带文档 Boost Getting Started,或者网站
http://boost.org/doc/libs/1_46_1/more/getting_started/windows.html
http://boost.org/doc/libs/1_46_1/more/getting_started/unix-variants.html

中文化文档
http://code.google.com/p/boost-doc-zh/downloads/list

boost 编译
http://blog.csdn.net/killiori/archive/2010/05/16/5598333.aspx
http://www.cppblog.com/tx7do/archive/2007/08/21/30504.html

BJAM编译工具的使用(一)——如何编译Boost
http://www.cppblog.com/gau2008/articles/109910.html

Boost 库命名规则(翻译)
http://blog.csdn.net/WuErPing/archive/2009/05/11/4167843.aspx

Boost C++ 库 第 11 章 序列化
http://zh.highscore.de/cpp/boost/serialization.html

试用boost.serialize序列化对象
http://www.cppblog.com/liquidx/archive/2009/06/18/88007.html
boost之序列化
http://blogold.chinaunix.net/u1/44543/showart_1351170.html
datastream, C++数据序列化与反序列化容器
http://www.cppblog.com/xmli/archive/2008/10/15/64030.html
序列化——Boost Serialization库
http://blog.sina.com.cn/s/blog_6fb5b7b80100m6on.html

C++ Boost 之Lexical_cast
http://blog.csdn.net/universee/archive/2006/01/12/577131.aspx

--------------------------------------------------------------------------------

 

本文原创,转载请注明出处 http://blog.sina.com.cn/faithfish

抱歉!评论已关闭.