Boost 使用方法

关于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”而不是空的。通过搜索,发现

 

 

现在终于清楚了,我们应该在工程设置中加入_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的开头。

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Boost库是一个跨平台的C++库,提供了许多多线程编程的工具和类。下面是使用Boost库进行多线程编程的一些方法: 1. 创建线程 ```cpp #include <boost/thread.hpp> void my_thread_func() { // 线程执行的代码 } int main() { // 创建新线程 boost::thread my_thread(my_thread_func); // 等待线程结束 my_thread.join(); return 0; } ``` 2. 线程同步和互斥 ```cpp #include <boost/thread.hpp> boost::mutex my_mutex; void my_thread_func() { // 申请互斥锁 boost::mutex::scoped_lock lock(my_mutex); // 互斥锁保护的代码 } int main() { // 创建新线程 boost::thread my_thread(my_thread_func); // 等待线程结束 my_thread.join(); return 0; } ``` 3. 线程池 ```cpp #include <boost/thread.hpp> #include <boost/bind.hpp> void my_thread_func(int arg) { // 线程执行的代码 } int main() { // 创建线程池 boost::thread_pool my_thread_pool(4); // 提交任务到线程池 for (int i = 0; i < 10; ++i) { my_thread_pool.submit(boost::bind(my_thread_func, i)); } // 等待任务完成 my_thread_pool.wait(); return 0; } ``` 4. 条件变量 ```cpp #include <boost/thread.hpp> #include <boost/date_time.hpp> boost::mutex my_mutex; boost::condition_variable my_cond_var; void my_thread_func() { // 申请互斥锁 boost::mutex::scoped_lock lock(my_mutex); // 等待条件变量 my_cond_var.wait(lock); // 条件满足后继续执行 } int main() { // 创建新线程 boost::thread my_thread(my_thread_func); // 等待一段时间 boost::this_thread::sleep(boost::posix_time::seconds(2)); // 通知条件变量 my_cond_var.notify_one(); // 等待线程结束 my_thread.join(); return 0; } ``` 以上是使用Boost库进行多线程编程的一些方法,可以根据实际需求进行选择和组合,以实现更加复杂的多线程应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值