关于Boost库的使用网上有很多文章介绍,但随着boost的发展,一些老的方法已经失效,这里列出最新的使用方法备查!
boost库是一个跨平台的C++库
下载了boost包之后,运行其根目录下的bootstrap.bat生成bjam.exe文件,bjam.exe是生成boost库的.lib文件的工具
然后在命令行输入
bjam stage --toolset=msvc-10.0 --stagedir="D:/U3D Demo/AsioTestServer/boost_1_45_0" link=shared runtime-link=shared threading=multi debug release
或
bjam stage --toolset=msvc-10.0 --stagedir="D:/U3D Demo/AsioTestServer/boost_1_45_0" link=static runtime-link=static threading=multi debug release
上一句是生成动态库,下一句是生成静态库
编译时间比较长,编译完成以后,目录中会多一个lib目录,里面就是库文件了
回到VS2010一编译,报错之!错误 1 error LNK1104: 无法打开文件“libboost_system-vc100-mt-gd-1_45.lib” ......
查找之,使用boost库不需要在工程设置中显式的指定库名字,而是由boost自身来完成这个设定的。由于boost库跨平台并且支持多个编译环境,因此这个被链接库文件的文件名是根据当前编译的配置动态生成的。boost_system是库的基本名称,vc100是编译环境,mt表示这是一个多线程库,gd表示包含调试信息,最后的1_45是版本号。检查lib目录的库文件,发现有boost_system-vc100-mt-gd-1_45.lib,所以很明显,在库名生成的过程中出现了问题,多了一个“lib”前缀。
打开boost/regex.hpp,继续打开boost/regex/config.hpp文件,最终可以发现动态链接配置的功能是由boost/config/auto_link.hpp统一实现的。在这个文件开头的注释里详细说明了使用方式。这里提到了名称的构造公式:
BOOST_LIB_PREFIX
+ BOOST_LIB_NAME
+ "_"
+ BOOST_LIB_TOOLSET
+ BOOST_LIB_THREAD_OPT
+ BOOST_LIB_RT_OPT
"-"
+ BOOST_LIB_VERSION
根据我们的错误,我们应该检查BOOST_LIB_PREFIX的值为什么是“lib”而不是空的。通过搜索,发现
- #if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)
- # define BOOST_LIB_PREFIX
- #elif defined(BOOST_DYN_LINK)
- # error "Mixing a dll boost library with a static runtime is a really bad idea..."
- #else
- # define BOOST_LIB_PREFIX "lib"
- #endif
现在终于清楚了,我们应该在工程设置中加入_DLL定义或者_RTLDLL定义,并且指定boost库采用动态连接(定义BOOST_DYN_LINK)。
在工程设置中加入_DLL;BOOST_DYN_LINK,链接通过。 但又报另一个库链接错误,错误原因相同,查看auto_link.hpp文件末尾,发现
#if defined(BOOST_DYN_LINK)
# undef BOOST_DYN_LINK
#endif
这样,刚定义的BOOST_DYN_LINK在用过一次之后就失效了,所以注释这一段,之后编译就没问题了。分析要么在工程中添加BOOST_DYN_LINK,然后注释undef这段代码,要么把BOOST_DYN_LINK定义在auto_link.hpp的开头
转自http://blog.youkuaiyun.com/chenchao868/article/details/6163230