开始上手使用Boost

http://ju.outofmemory.cn/entry/106397

上手使用Boost

敏毅 2014-05-10 7200 阅读

C++

开始上手使用Boost

目录

1 前言

知道Boost有一段时间了,也编译过几次,但还是感觉有点陌生;查看了一些别人写的boost编译安装笔记,自己也整理一下,毕竟后面会长期打交道。

2 YUM安装

如果怕源码编译麻烦,就可以使用yum自动安装,如:

sudo yum install boost-devel.x86_64 boost-test.x86_64 boost.x86_64

编译后默认:

头文件目录: /usr/include/boost/

库文件目录:(on Fedora)
/lib64/libboost_thread.so
/lib64/libboost_atomic.so
/lib64/libboost_chrono.so
/lib64/libboost_date_time.so
/lib64/libboost_context.so
/lib64/libboost_log.so
/lib64/libboost_locale.so
/lib64/libboost_iostreams.so
/lib64/libboost_graph.so
/lib64/libboost_filesystem.so
/lib64/libboost_math_c99.so
/lib64/libboost_math_c99l.so
/lib64/libboost_math_c99f.so
/lib64/libboost_log_setup.so
/lib64/libboost_math_tr1.so
/lib64/libboost_math_tr1l.so
/lib64/libboost_math_tr1f.so
/lib64/libboost_random.so
/lib64/libboost_python.so
/lib64/libboost_program_options.so
/lib64/libboost_prg_exec_monitor.so
/lib64/libboost_system.so
/lib64/libboost_signals.so
/lib64/libboost_serialization.so
/lib64/libboost_regex.so
/lib64/libboost_timer.so
/lib64/libboost_wserialization.so
/lib64/libboost_wave.so
/lib64/libboost_unit_test_framework.so

3 源码安装

如果对boost的使用想自己配置的更加灵活些,可以采用源码安装方式:

3.1 下载

官网http://www.boost.org/ 下载一个版本的源码

3.2 安装

解压后,会有一个文件bootstrap.sh,执行这个脚本,会产生:

tools/build/v2/b2
tools/build/v2/bjam

这两个文件会自动复制到boost解压顶级目录,执行命令:

b2 --toolset=gcc link=static runtime-link=static threading=multi --without-python stage --stagedir=./ debug release  --includedir=/usr/include/ --libdir=/usr/lib/boost

b2命令有很多选项,这些选项决定了以后如何使用boost:

  • toolset,指定编译器
  • link,编译成静态库static,或者动态库share,但一般是使用static
  • threading,使用多线程则是multi,否则为single
  • runtime-link,动态链接shared或静态链接static
  • with/without,选择编译或不编译指定的库
  • stage/install,推荐使用stage,只生成lib文件,而boost源码目录作为头文件目录
  • stagedir/prefix, stage时使用stagedir,install时用prefix,用于存放编译生成文件的路径
  • debug/release,一般程序的debug release版本对应boost库的debug release版本,因此两个都编译
  • includedir=/usr/include/,指定头文件的安装目录
  • libdir=/usr/lib/boost,指定库文件安装路径

3.3 完全安装

也可以进行完全编译,需要等待很长时间:

$b2 --build-type=complete

静态库文件(on Mac):

/opt/local/lib/libboost_atomic-mt.a
/opt/local/lib/libboost_atomic-mt.dylib
/opt/local/lib/libboost_chrono-mt.a
/opt/local/lib/libboost_chrono-mt.dylib
/opt/local/lib/libboost_context-mt.a
/opt/local/lib/libboost_context-mt.dylib
/opt/local/lib/libboost_coroutine-mt.a
/opt/local/lib/libboost_coroutine-mt.dylib
/opt/local/lib/libboost_date_time-mt.a
/opt/local/lib/libboost_date_time-mt.dylib
/opt/local/lib/libboost_exception-mt.a
/opt/local/lib/libboost_filesystem-mt.a
/opt/local/lib/libboost_filesystem-mt.dylib
/opt/local/lib/libboost_graph-mt.a
/opt/local/lib/libboost_graph-mt.dylib
/opt/local/lib/libboost_iostreams-mt.a
/opt/local/lib/libboost_iostreams-mt.dylib
/opt/local/lib/libboost_locale-mt.a
/opt/local/lib/libboost_locale-mt.dylib
/opt/local/lib/libboost_log-mt.a
/opt/local/lib/libboost_log-mt.dylib
/opt/local/lib/libboost_log_setup-mt.a
/opt/local/lib/libboost_log_setup-mt.dylib
/opt/local/lib/libboost_math_c99-mt.a
/opt/local/lib/libboost_math_c99-mt.dylib
/opt/local/lib/libboost_math_c99f-mt.a
/opt/local/lib/libboost_math_c99f-mt.dylib
/opt/local/lib/libboost_math_c99l-mt.a
/opt/local/lib/libboost_math_c99l-mt.dylib
/opt/local/lib/libboost_math_tr1-mt.a
/opt/local/lib/libboost_math_tr1-mt.dylib
/opt/local/lib/libboost_math_tr1f-mt.a
/opt/local/lib/libboost_math_tr1f-mt.dylib
/opt/local/lib/libboost_math_tr1l-mt.a
/opt/local/lib/libboost_math_tr1l-mt.dylib
/opt/local/lib/libboost_prg_exec_monitor-mt.a
/opt/local/lib/libboost_prg_exec_monitor-mt.dylib
/opt/local/lib/libboost_program_options-mt.a
/opt/local/lib/libboost_program_options-mt.dylib
/opt/local/lib/libboost_python-mt.a
/opt/local/lib/libboost_python-mt.dylib
/opt/local/lib/libboost_random-mt.a
/opt/local/lib/libboost_random-mt.dylib
/opt/local/lib/libboost_regex-mt.a
/opt/local/lib/libboost_regex-mt.dylib
/opt/local/lib/libboost_serialization-mt.a
/opt/local/lib/libboost_serialization-mt.dylib
/opt/local/lib/libboost_signals-mt.a
/opt/local/lib/libboost_signals-mt.dylib
/opt/local/lib/libboost_system-mt.a
/opt/local/lib/libboost_system-mt.dylib
/opt/local/lib/libboost_test_exec_monitor-mt.a
/opt/local/lib/libboost_thread-mt.a
/opt/local/lib/libboost_thread-mt.dylib
/opt/local/lib/libboost_timer-mt.a
/opt/local/lib/libboost_timer-mt.dylib
/opt/local/lib/libboost_unit_test_framework-mt.a
/opt/local/lib/libboost_unit_test_framework-mt.dylib
/opt/local/lib/libboost_wave-mt.a
/opt/local/lib/libboost_wave-mt.dylib
/opt/local/lib/libboost_wserialization-mt.a
/opt/local/lib/libboost_wserialization-mt.dylib

如果时间足够,就进行完全编译,想怎么用都可以;事实上编译完成后除了boost和bin目录之外其他目录和文件已经可以删除了。

4 使用boost编程

  • Linux中的动态链接库是.so文件
  • Windows中的动态链接库是.dll文件
  • Mac中的动态链接库是.dylib文件

4.1 Linux动态链接编译 (.so)

使用boost需要配置两个路径:

  • include目录
  • library目录

加到~/.bashrc

BOOST_INCLUDE=/usr/include/boost
export BOOST_INCLUDE

BOOST_LIB=/lib64/
export BOOST_LIB

举例:

#include <boost/thread/thread.hpp>
#include <iostream>

using namespace std;

void hello_world()
{
  cout << "Hello world, I'm a thread!" << endl;
}

int main (int argc, char* argv[])
{
  boost::thread my_thread(&hello_world);
  my_thread.join();

return 0;
}

编译:

$ g++ Thread.cc -lboost_thread -o test 
$ ./test
Hello world, I'm a thread!

4.2 静态链接编译static (.a)

另外一个例子,下载的源码完全编译的Boost:

#include <iostream>
#include <boost/program_options.hpp>

namespace po = boost::program_options;
using namespace std;

int main(int argc, const char * argv[])
{

  string requestid = "";
  string pageid = "0";

  try {
      po::options_description desc("options");
      desc.add_options()
          ("help", "print help messages")
          ("requestid",po::value<string>(), "the search request id")
          ("pageid",po::value<string>(), "the page id in XML file")
          ;

      po::variables_map vm;
      po::store(po::parse_command_line(argc, argv, desc), vm);
      po::notify(vm);

      if (vm.count("help")) {
          cout << desc << "\n";
          return 0;
      }

      if (vm.count("requestid")) {
          cout << "the search request id set to "
               << vm["requestid"].as<string>() << ".\n";
          requestid = vm["requestid"].as<string>();

          if(vm.count("pageid")){
              pageid = vm["pageid"].as<string>();
          }
          cout << " the page id: " << pageid  << "\n";
      } else {
          cout << "Please input search request id.\n";
      }
  }

  catch(exception &e) {
      cerr << "error: " << e.what() << "\n";
      return 1;
  }

  catch(...) {
      cerr << "Exception of unknow type!\n";
  }

  return 0;
}

静态链接编译:

$ g++ test.cpp -I ~/boost_1_55_0/    ~/boost_1_55_0/stage/lib/libboost_program_options.a -o test1

$ otool -L test1

test1:
         /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
         /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

$ ./test1 --help
options:
  --help                print help messages
  --requestid arg       the search request id
  --pageid arg          the page id in XML file

4.3 Mac动态链接编译(.dylib)

编译:

$ g++ test.cpp -I $BOOST  -L /opt/local/lib/ -lboost_program_options-mt -o test2

$ otool -L test2

test2:
         /opt/local/lib/libboost_program_options-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
         /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
         /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

$ ./test2 --help
options:
  --help                print help messages
  --requestid arg       the search request id
  --pageid arg          the page id in XML file

5 参考


作者简介:

朱春来(Leslie Zhu),金融工程师,毕业于西安电子科技大学, 喜欢历史,喜欢编程. 日常在GNU/Linux环境下进行C/C++、Python开发,对Common Lisp、Node.js、金融等感兴趣。可以通过邮箱(pythonisland@gmail.com)联系他,或者直接在他的个人主页上留言.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值