首先下载源代码包,解压之后,先得生成bjam——boost的构建工具。windows下
project-config.jam中指定了bjam要用的toolset,最常用的包括:msvc,gcc这两个。
比如我要用mingw编译boost,那么就得把project-config-jam中内容修改为using gcc ;注意gcc后面留有一个空格,然后才是分号。少了这个空格,会报文件EOF语法错。默认生成的是using msvc ;
另一种方法是在bjam命令行中指定编译工具。bjam toolset=msvc-9.0 注意不能写成vc9,使用bjam --help,查看所有bjam选项:
bjam [options] [properties] [install | stage]
不是所有的模块都需要单独编译,有的只需包含头文件即可使用。但是包含头文件即可使用也不意味着就不需要依赖库,比如asio,它依赖system模块, 如果用到跟正则表达式有关的函数还需要regex模块等等。
可单独编译的库有:
date-time, filesystem, graph,graph_parallel, iostreams, math, mpi, program_options,python,random, regex, serialization, signals, system, test, thread, wave.
其他的库不需单独编译,直接使用。比如asio,如果试图单独编译asio库,bjam --with-asio,则会报wrong library name错误。
不常用的库也可不编译,比如graph, graph_parallel, mpi, program_options, python, 使用选项--without-xxx。
bjam --build-type=complete toolset=gcc --without-graph --without-graph_parallel --without-math --without-mpi --without-program_options --without-python --without-serialization --without-test --without-wave
[lib]<boost模块名>-<toolset编译器>[-mt][-sgdyp]<-boost版本>.<扩展名>
#include <iostream> #include <boost/asio.hpp> #include <boost/date_time/posix_time/posix_time.hpp> using namespace std; int main() { cout<<"begin"<<endl; boost::asio::io_service io; boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); t.wait(); cout<<"end"<<endl; return 0; }
上述代码,都依赖哪些boost模块呢?
使用msvc编译真是有些玄妙:
使用预定义宏BOOST_ALL_DYN_LINK,动态链接:则编译时需要动态链接库导入库system,date_time,regex,执行时需要system,date_time。
使用预定义宏BOOST_ALL_NO_LIB,动态链接:则编译时需要动态链接库导入库system,执行时也只需要system。
使用预定义宏BOOST_ALL_NO_LIB,静态链接:则编译时需要静态库system,执行时不需要system。
使用mingw编译,一切正常:
注意上述几个预定义宏只对msvc有用而对mingw是不起作用的
动态链接:则编译时需要动态链接库导入库system,执行时也只需要system
静态链接:则编译时需要静态库system,执行时不需要system
当然ws2_32, Mswsock总是要指定链接的。