Linux中安装编译Boost库
介绍 Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。 Boost由于其对跨平台的强调,对标准C++的强调,与编写平台无关。大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文 件系统库等)需要链接库。但Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。
编译、安装
我的实现步骤如下:
1、官网下载boost_1_46_0.tar.gz,按照默认的情况,把它解包到 /usr/local/ 里面。
下载地址:http://sourceforge.net/projects/boost/files/boost/
2、boost 库的安装应该分为两部分:第一部分是安装无需编译(Head Only)的boost库,第二部分是安装需要单独编译(Separately-Compiled)的boost库。
3、Head Only的编译:Boost的User Guide中说,Head Only的编译是无需做任何操作的。运行它提供的例子,是可以显示的。
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
using namespace boost::lambda;
typedef std::istream_iterator<int> in;
std::for_each(
in(std::cin), in(), std::cout << (_1 * 3) << " " );
return 0;
}
将其保存为:example.cpp
编译:[root@localhost boost_1_46_0]#c++ -I /usr/local/boost_1_46_0 example.cpp -o example
运行:[root@localhost boost_1_46_0]#echo 1 2 3 | ./example
显示结果; 3 6 9
4、Separately-Compiled的编译,需要用到bjam(boost jam),这是专门为boost开发的编译工具。
进到/usr/local/boost_1_46_0文件夹
[root@localhost boost_1_46_0]#./bootstrap.sh
[root@localhost boost_1_46_0]#./bjam install
到这里就算编译完成了,在/usr/local/的include和lib中生成了boost库文件和头文件。其中/usr/local/是boost的默认安装路径,如果需要指明include和lib的安装位置,可以通过一下命令实现。
[root@localhost boost_1_46_0]#./bjam -a "-sTOOLS=gcc" "--includedir=/usr/include" "--libdir=/usr/lib/boost" "--build-type=complete" threading=multi "--layout=tagged" install
总结
Boost编译用到了专门的编译工具bjam,而不是平时常用的make。网上提供了很多种方式获取bjam,有人总结了三种,因为没有尝试过其他的方式,就不一一列出。boost_1_46_0版本不需要单独再获取bjam,只需要运行 [root@localhost boost_1_46_0]#./bootstrap.sh 即可自动生成bjam。
详细的内容可以参阅:boost_1_46_0/more/getting_started/index
笔者很简单的安装了,boost_1_53_0.tar.bz2这个版本。
执行了./bootstrap.sh和./bjam install,仅仅这两条命令。
也没有设置环境变量,如头文件路径和库函数路径。
但是发现头文件和库文件的默认安装到的位置了,如下图:
例子:
#include <iostream>
#include <boost/shared_ptr.hpp> // shared_ptr
#include <boost/array.hpp> // array
#include <boost/tokenizer.hpp> // tokenizer
#include <boost/format.hpp> // format
#include <boost/date_time/gregorian/gregorian.hpp> // date_time
#include <memory> // auto_ptr
#include <string>
#include <vector>
#include <list>
#include <deque>
#include <algorithm>
using namespace std;
using namespace boost;
using namespace boost::gregorian; // 需要使用这个
template<typename T>
void printElement(T element)
{
cout << element << " ";
}
int main()
{
date d1;
date d2(2012, 9, 11);
cout << d1 << endl;
cout << d2 << endl;
assert(d2.year() == 2012);
assert(d2.month() == 9);
assert(d2.day() == 11);
cout << day_clock::local_day() << endl;
cout << day_clock::universal_day() << endl;
return 0;
}
程序输出: