在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.
測試結果如下圖所示:
