Boost併發編程(多線程)編譯鏈接所遇到的問題

        在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

        本文所遇到的問題就是在第十二章併發編程中所碰到的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章