现在的位置: 首页 > 综合 > 正文

Boost并发编程(多线程)编译链接所遇到的问题

2013年08月15日 ⁄ 综合 ⁄ 共 1413字 ⁄ 字号 评论关闭

        在Boost库使用过程中,一般仅仅需要配置好头文件路径、库文件路径即编程。在实际的编程中,对于常规的Boost知识(时间、格式化、字符串处理)使用一般无大碍,只是要注意一下命名空间的导入即可。但是对于并发编程而言,则不会这么简单。这一般要牵涉到项目属性设置、项目宏定义、动态库添加等等。

        下面以最简单的控制台项目为例,来简要讲解一下。

        一、建立控制台项目。

        建立控制台项目,在项目内部添加.cpp文件,并在文件内添加以下代码:

        #include <boost/thread/thread.hpp>

        using namespace boost;

      

        int main()
       {
               mutex mu;

 

               mutex::scoped_lock lock(mu);

               cout << "some operations" << endl;

 

               return 0;
       }

        二、编译项目

       编译项目,将会出现以下链接错误:

        fatal error C1189: #error :  "Compiler threading support is not turned on. Please set the correct command line options for threading: either /MT /MTd /MD or /MDd"

        解决方法:找到“项目属性---->配置属性---->C/C++---->代码生成---->运行时库”,将原有默认的“单线程调试(/MLd)”修改为“多线程 DLL (/MD)”。

        再度编译,将会出现以下链接错误:

        fatal error LNK1104: 无法打开文件“libboost_thread-vc71-mt-gd-1_36.lib”

        解决方法:找到“项目属性---->配置属性---->C/C++---->预处理器---->预处理器定义”,在其中填上BOOST_ALL_DYN_LINK宏定义即可。

        再度编译,正确。

        三、补充知识(/MD、MDd 、/MT、MTd)

       后面的那个'd'是代表DEBUG版本,没有'd'的就是RELEASE版本了。
       /MT是 "multithread, static version ” 意思是多线程静态的版本,定义了它后,编译器把LIBCMT.lib 安置到OBJ文件中,让链接器使用LIBCMT.lib 处理外部符号。
       /MD是 "multithread- and DLL-specific version” ,意思是多线程DLL版本,定义了它后,编译器把 MSVCRT.lib 安置到OBJ文件中,它连接到DLL的方式是静态链接,实际上工作的库是MSVCR80.DLL。

       四、Boost学习教程

       个人建议采用《Boost程序库完全开发指南》一书,可以从本人CSDN资源上进行下载,下载地址为:

       http://download.csdn.net/detail/wghhdzwzqbx02/4253537

        本文所遇到的问题就是在第十二章并发编程中所碰到的。

抱歉!评论已关闭.