boost_1_54_0/ .................Boost的根目录html
|
图1.Boost文件目录 |
使用boost库并非全部的库都须要编译。只要程序引入头文件就OK。
举出反例,下列库是须要单独编译的。
而有些库能够选择是否单独编译
1 /* 2 *输出为输入数字的三倍 3 **/ 4 #include <boost/lambda/lambda.hpp> 5 #include <iostream> 6 #include <iterator> 7 #include <algorithm> 8 int main() 9 { 10 using namespace boost::lambda; 11 typedef std::istream_iterator<int> in; 12 13 std::for_each( 14 in(std::cin), in(), std::cout << (_1 * 3) << " " ); 15 }
有两种方法编译:
1.使用我刚才的方法,把./boost/文件夹(头文件)下全部的文件拷入/usr/local/include,按普通方法编译g++就ok(博主本身使用的)。
2.编译时指定编译路径(即boost根目录) c++ -I boost_1_54_0's_path example.cpp -o example(官方推荐使用)。
ok,第一个使用boost程序就跑通了。
6.编译使用boost库
正如前面所说,部分库是须要使用进行编译的,好比正则。有两种方式,一个是很是简单的(推荐),第二个是能够定制。
6.1简单的编译安装
进入boost根文件,执行下列命令能够获取帮助,固然都是E文,英文好的同窗能够看看,讲的很是清楚。ps.请用root权限运行下列命令
$ cd path/to/boost_1_54_0 $ ./bootstrap.sh --help
若是你没有/usr/local(默认将编译后的库放在此目录)的写入权限,须要指定下安装目录。
$ ./bootstrap.sh --prefix=path/to/installation/prefix
指定编译库:可使用参数--show-libraries获取全部待安装的库,可使用--with-libraries=库的名称1,库的名称2,.....来安装指定库,或者--without-libraries=list来指定不须要编译的库。不设定的话就是安装默认库。
1 //编译指定库,所有安装的能够跳过 2 $ ./bootstrap.sh ----show-libraries 3 $././bootstrap.sh --with-libraries=name1,name2,name3....
最后执行如下命令进行编译安装,程序将会把头文件放置于/usr/local/include 库放在/usr/local/lib中
$ ./b2 install
若是选择所有编译,将会消耗半个小时左右时间(根据具体机器配置而定),1个G左右硬盘空间。因此编译以前,请确保有这么大的磁盘空间。OK,编译完成,能够忽略如下步骤。
6.2编译定制版
说实话,博主如今还不肯定,这个定制版具体和上面那个有什么不一样。上面那个多是使用默认编译器,编译后默认生成release,多线程、静态库+动态库的版本。这个版本多是能够指定不一样编译器,指定具体的编译后的版本,好比单线程,动态库之类。
6.2.1安装Boost.Build
1.进入tools/build/v2/目录
2.执行bootstrap.sh
3.执行b2 install --prefix=PREFIX,PREFIX为b2安装的指定目录
4.将PREFIX/bin加入环境变量,因此博主建议PREFIX设置为/usr/local/
6.2.2调用b2
进入boost根目录,执行b2代码
b2 --build-dir=build-directory toolset=toolset-name stage /*build-directory为中间文件放置的目录,若是当前文件夹不可读好比说光盘,就要指定下。toolset为编译器名称,通常为gcc,stage为当前文件夹下的文件夹,程序将把编译后的库放于此*/
好比以下代码,具体定制版本能够参考这个网站Boost.Build documentation.,或者经过b2 --help查看
$ cd ~/boost_1_54_0 $ b2 --build-dir=/tmp/build-boost toolset=gcc stage
7.链接使用boost库
以正则库为例
#include <boost/regex.hpp> #include <iostream> #include <string> int main() { std::string line; boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" ); while (std::cin) { std::getline(std::cin, line); boost::smatch matches; if (boost::regex_match(line, matches, pat)) std::cout << matches[2] << std::endl; } }
有两种方式:
1.静态库:g++ -o test test.cpp /usr/local/lib/libboost_regex.a.若是你的头文件不在/usr/local/include请用-I指定。
2.动态库:g++ -o test test.cpp -lboost_regex,(若是没找到该库,能够执行ldconfig刷新下)。若是你的动态库的路径不在/usr/local/lib,那么请用 -L参数指定。同时运行时也要指定该动态库的位置。
关于动态库和静态库的区别,限于篇幅问题,请你们本身百度。
程序使用结果:
输入:
To: George Shmidlap From: Rita Marlowe Subject: Will Success Spoil Rock Hunter? --- See subject.
输出为:
To: George Shmidlap From: Rita Marlowe Subject: Will Success Spoil Rock Hunter? --- See subject. Will Success Spoil Rock Hunter?
即用正则表达式,提早Subject后面的字符串。
OK,至此,咱们的boost的库就已经搭建成功,之后若是博主有什么新发现会继续更新的。
Wind
2013-11-06