http://ju.outofmemory.cn/entry/106397
上手使用Boost
敏毅 2014-05-10 7200 阅读
开始上手使用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 参考
- http://www.cnblogs.com/wondering/archive/2009/05/21/boost_setup.html
- http://osiris.laya.com/coding/dylib_linking.html
- https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man1/dyld.1.html
- https://mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html
- http://my.oschina.net/u/1413984/blog/199027
作者简介:
朱春来(Leslie Zhu),金融工程师,毕业于西安电子科技大学, 喜欢历史,喜欢编程. 日常在GNU/Linux环境下进行C/C++、Python开发,对Common Lisp、Node.js、金融等感兴趣。可以通过邮箱(pythonisland@gmail.com)联系他,或者直接在他的个人主页上留言.