在Windows10中Visual Studio2017中使用boost1.69.0

  • 2020 年 3 月 10 日
  • 筆記

前言

Boost是一個功能強大、構造精巧、跨平台、開源而且完全免費的C++程式庫,有著「C++ '准』標準庫」的美譽。 Boost是由C++標準委員會部分成員所設立的Boost社區開發並維護,使用了許多現代C++編程技術,內容涵蓋字元串處理、正則表達式、容器與數據結構、並發編程、函數式編程等。目前已經更新到了1.72.0版本,官網下載地址為:https://www.boost.org/users/history/version_1_72_0.html,由於我之前在自己Windows10系統上安裝的是Boost 1.69.0,其源程式碼下載地址為:https://sourceforge.net/projects/boost/files/boost/1.69.0/,所以本文直接演示在VS2017下使用boost1.69.0版本,使用32位的debug模式進行測試,其他的64位和VS編譯器同理。

一、從sourceforge上下載編譯好的針對MSVC的boost1.69.0版本

由於從源程式碼直接編譯Boost比較費時,所以sourceforge-boost1.69.0-msvc上有人提供了編譯好的boost1.69.0的MSVC版本,如下圖所示:

上圖中是針對MSVC編譯器即Visual VC++編譯boost1.69.0的版本, 其中msvc是VC++編譯器的名稱,12.0代表是VS2013的版本,14.0是VS2015的版本,14.1是VS2017的版本,32和64表示是生成支援32位的還是64位的lib或dll庫。

這樣就不用我們自己編譯Boost源程式碼,下載boost_1_69_0-msvc-14.1-64.exe這些文件加壓縮到指定的目錄後,包含對應的頭文件和庫文件,就可以直接在Visual Studio2017中使用了。 由於我自己的Windows10系統上同時安裝了VS2013和VS2017,我下載了3個版本的,如下圖所示:

將boost_1_69_0-msvc-14.1-32.exe解壓到指定目錄

以boost_1_69_0-msvc-14.1-32.exe為例,解壓後的目錄結構如下圖所示:

為了方便,我直接把boost_1_69_0-msvc-12.0-32.exe、boost_1_69_0-msvc-14.1-32.exe、boost_1_69_0-msvc-14.1-64.exe這3個程式的lib庫解壓到同一目錄下了,分別對應lib32-msvc-12.0、lib32-msvc-14.1、 、lib64-msvc-14.1

在VS2017中使用boost1.69.0

例如,我把編譯好後的boost_1_69_0源程式碼和lib庫放置在D:env_buildboost_1_69_0目錄下,其中boost目錄是存放頭文件的目錄,lib32-msvc-12.0、lib32-msvc-14.1、 、lib64-msvc-14.1這3個目錄分別對應VS2013的32位,VS2017的32位以及VS2017的64位靜態庫lib目錄。

源程式碼文件:Boost_lambda_Demo.cpp

在VS2017中創建一個VC++的控制台空項目Boost_lambda,添加一個Boost_lambda_Demo.cpp文件,程式碼如下:

#include <boost/lambda/lambda.hpp>  #include <iostream>  #include <iterator>  #include <algorithm>    int main(int argc, char* argv[])  {  	using namespace boost::lambda;  	typedef std::istream_iterator<int> in;    	std::for_each(  		in(std::cin), in(), std::cout << (_1 * 3) << "n");    	return 0;  }

如下圖所示:

從上圖可以看出,由於沒有包含boost庫的頭文件,程式報錯了,所以我們還得在項目中導入頭文件和lib庫文件所在目錄。

添加boost的頭文件

右鍵點擊【Boost_lambda】-》【屬性】,在彈出的項目屬性頁中,依次【配置屬性】-> 【C/C++】-> 【常規】->【附加包含目錄】,在其中加入boost1.69.0所在目錄,我的是D:env_buildboost_1_69_0,這個根據自己解壓的Boost庫目錄設置,如下圖所示:

點擊確定按鈕後,再看程式中的紅色報錯提示沒有了,說明項目中可以使用Boost庫了,如下圖所示:

運行結果如下圖所示:

當然,由於boost的lambda的使用只需要包含頭文件即可,所以不導入lib靜態庫文件也可以正常運行,但是如果是其他比如regex正則表達式需要依賴靜態庫的,則會報錯,如下圖所示:

1>LINK : fatal error LNK1104: 無法打開文件「libboost_regex-vc141-mt-gd-x32-1_69.lib」 錯誤原因是找不到對應的libboost_regex-vc141-mt-gd-x32-1_69.lib靜態鏈接庫

添加boost1.69.0的lib靜態庫文件

右鍵點擊【Boost_lambda】-》【屬性】,在彈出的項目屬性頁中,依次【配置屬性】-> 【鏈接器】-> 【常規】->【附加庫目錄】,在其中加入boost1.69.0的lib庫所在目錄,由於我使用的是基於VS2017的32位x86 debug項目,所以需要加入lib32-msvc-14.1這個目錄,即D:env_buildboost_1_69_0lib32-msvc-14.1,這個根據自己解壓的Boost庫目錄進行設置,和項目是32位還是64位以及Visual Studio的版本有關,如下圖所示:

由於boost regex庫的使用不僅需要包含頭文件,還需要包含對應的lib靜態庫文件,所以需要在項目中加入對應的靜態庫目錄,如下圖所示:

運行結果如下:

為了能看到boost regex的測試結果,我把程式直接放到騰訊雲主機上的CentOS7.5系統下,創建了一個boost_regex.cpp的源程式碼文件和對應的jayne.txt文本文件 boost_regex.cpp的源程式碼文件:

#include <boost/regex.hpp>  #include <iostream>  #include <string>    int main()  {  	std::string line;  	boost::regex pattern("^Subject: (Re: |Aw: )*(.*)");    	while (std::cin)  	{  		std::getline(std::cin, line);  		boost::smatch matches;  		if (boost::regex_match(line, matches, pattern))  		{  			std::cout << matches[2] << std::endl;  		}  	}    	return 0;  }

jayne.txt文本文件

To: George Shmidlap  From: Rita Marlowe  Subject: Will Success Spoil Rock Hunter?  ---  See subject.

測試結果如下圖所示:

相關資料