這篇文章主要講解了Windows怎么配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營(yíng)銷推廣、網(wǎng)站重做改版、呼瑪網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁(yè)面制作、商城開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為呼瑪?shù)雀鞔蟪鞘刑峁┚W(wǎng)站開發(fā)制作服務(wù)。
平時(shí)習(xí)慣了在Linux環(huán)境寫C++,有時(shí)候切換到Windows想繼續(xù)在同一個(gè)項(xiàng)目上工作,重新配置環(huán)境總是很麻煩。雖然Windows下用Visual Studio寫C++只需要雙擊個(gè)圖標(biāo),但我還是想折騰一下VS Code的環(huán)境配置。原因主要有兩點(diǎn):一是個(gè)人習(xí)慣上各種語(yǔ)言都在VS Code里面寫,利用Git同步代碼可以很方便地在不同平臺(tái)開發(fā)同一個(gè)項(xiàng)目;二是有些情形下無(wú)法使用圖形化界面,比如為Git配置CI(持續(xù)性集成)時(shí)顯然不能用Visual Studio這個(gè)圖形化的IDE來(lái)執(zhí)行Windows環(huán)境的測(cè)試。
本文涉及的環(huán)境和工具版本:
主要內(nèi)容
1 創(chuàng)建C++項(xiàng)目
2 安裝Visual Studio
3 安裝CMake和Ninja
4 下載和編譯Boost
4.1 Command Prompt的使用
4.2 編譯Boost
5 命令行編譯和測(cè)試
6 配置VS Code
6.1 settings.json
6.2 c_cpp_properties.json
6.3 tasks.json
6.4 launch.json
6.5 CMakeLists.txt
6.6 編譯、測(cè)試和調(diào)試
創(chuàng)建C++項(xiàng)目
VSCode及插件的安裝過(guò)程本文暫不介紹,這里直接給出項(xiàng)目的文件結(jié)構(gòu)和代碼。
項(xiàng)目結(jié)構(gòu)如下。 .vscode
文件夾里面的3個(gè)json文件用來(lái)配置VS Code,第二個(gè)文件夾里面包含對(duì)LeetCode某一個(gè)問(wèn)題的解答( solution.hpp
和 solution.cpp
), solution_test.cpp
用來(lái)執(zhí)行單元測(cè)試。最下面的 CMakeLists.txt
文件用來(lái)配置CMake,給出項(xiàng)目的編譯規(guī)則。
這里先給出C++部分的代碼,其他文件的內(nèi)容會(huì)在后面給出。
solution.hpp
#ifndef SOLUTION_HEADER #define SOLUTION_HEADER #include <iostream> #include <vector> #include <unordered_set> using namespace std; class Solution { public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2); }; #endif solution.cpp #include "solution.hpp" static auto x = []() { // turn off sync std::ios::sync_with_stdio(false); // untie in/out streams cin.tie(NULL); return 0; }(); vector<int> Solution::intersection(vector<int>& nums1, vector<int>& nums2) { if (nums1.size() > nums2.size()) swap(nums1, nums2); unordered_set<int> A(nums1.begin(), nums1.end()), C; for (auto& i : nums2) { if (A.find(i) != A.end()) C.insert(i); } return vector<int>(C.begin(), C.end()); }
solution.cpp
#include "solution.hpp" static auto x = []() { // turn off sync std::ios::sync_with_stdio(false); // untie in/out streams cin.tie(NULL); return 0; }(); vector<int> Solution::intersection(vector<int>& nums1, vector<int>& nums2) { if (nums1.size() > nums2.size()) swap(nums1, nums2); unordered_set<int> A(nums1.begin(), nums1.end()), C; for (auto& i : nums2) { if (A.find(i) != A.end()) C.insert(i); } return vector<int>(C.begin(), C.end()); }
solution_test.cpp
#define BOOST_TEST_MODULE SolutionTest #include "solution.hpp" #include <boost/test/unit_test.hpp> BOOST_AUTO_TEST_SUITE(SolutionSuite) BOOST_AUTO_TEST_CASE(PlainTest1) { vector<int> nums1{1,2,2,1}; vector<int> nums2{2,2}; vector<int> results = Solution().intersection(nums1, nums2); vector<int> expected{2}; sort(results.begin(), results.end()); sort(expected.begin(), expected.end()); BOOST_CHECK_EQUAL_COLLECTIONS(results.begin(), results.end(), expected.begin(), expected.end()); } BOOST_AUTO_TEST_CASE(PlainTest2) { vector<int> nums1{4,9,5}; vector<int> nums2{9,4,9,8,4}; vector<int> results = Solution().intersection(nums1, nums2); vector<int> expected{9,4}; sort(results.begin(), results.end()); sort(expected.begin(), expected.end()); BOOST_CHECK_EQUAL_COLLECTIONS(results.begin(), results.end(), expected.begin(), expected.end()); } BOOST_AUTO_TEST_SUITE_END()
安裝Visual Studio
這里不詳述VS的安裝過(guò)程,只是提示一下需要安裝的組件。
需要注意Visual Studio Community 2019 Preview版本在編譯Boost不能被正確識(shí)別,需要安裝正式版。Visual Studio Community 2017/2019 兩個(gè)版本我都試驗(yàn)過(guò),這里以2019版本為例。
只需要安裝“使用C++的桌面開發(fā)”這一套組件就可以了。
安裝CMake和Ninja
CMake可以下載名為cmake-3.17.2-win64-x64.msi 的安裝包來(lái)安裝,Ninja 下載之后只有一個(gè)可執(zhí)行文件,可以隨意放在一個(gè)目錄下。
安裝過(guò)程暫不詳述,只需要注意安裝完成之后要設(shè)置一下環(huán)境變量。
設(shè)置好環(huán)境變量之后,可以重新打開命令行工具或終端,檢查一下CMake和Ninja的版本,看是否設(shè)置成功。
下載和編譯Boost
Boost可以從這個(gè)鏈接下載: https://dl.bintray.com/boostorg/release/1.73.0/source/ ,然后解壓到某個(gè)目錄下。
Boost本身是header-only的,即大部分情況下只需要包含其頭文件就能直接調(diào)用。但為了便于把我們自己的程序鏈接到Boost的單元測(cè)試模塊(Boost.Test),這里需要編譯一下Boost,產(chǎn)生靜態(tài)庫(kù)文件。
Command Prompt的使用
由于我們之前已經(jīng)安裝了Visual Studio以及在Windows平臺(tái)編譯C++所需的編譯工具和依賴庫(kù),所以我們可以直接利用VS提供的環(huán)境來(lái)編譯Boost。
在開始菜單的“Visual Studio 2019”目錄下可以發(fā)現(xiàn)幾個(gè)命令行工具,我們可以打開一個(gè)名為“x64 Native Tools Command Prompt for VS 2019”的命令行工具,這個(gè)圖標(biāo)在硬盤上對(duì)應(yīng)到 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat
這個(gè)腳本。該腳本的作用是把MSVC和Windows SDK的包含路徑、庫(kù)路徑等添加到環(huán)境變量,然后打開一個(gè)cmd命令行。所以在這個(gè)cmd運(yùn)行期間能夠直接檢測(cè)到編譯C++所需的所有依賴項(xiàng)。
我們可以試著在這個(gè)cmd當(dāng)中輸入 SET
,查看已經(jīng)生效的所有環(huán)境變量。
利用這些信息,我們?cè)诔R?guī)的cmd或PowerShell里也能正常編譯C++代碼。具體的過(guò)程會(huì)在后面介紹。
默認(rèn)cmd的字體有點(diǎn)難看,我個(gè)人習(xí)慣在Windows Terminal 里面開一個(gè)cmd終端,然后執(zhí)行下面的命令:
> "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
這就可以讓我們的新終端也能夠檢測(cè)到MSVC環(huán)境,如下圖所示。
編譯Boost
然后, cd
到Boost的根目錄,執(zhí)行下面的命令:
> bootstrap.bat > b2 --prefix=build install
等待編譯完成之后,在 build\lib
目錄下會(huì)出現(xiàn)一大堆 .lib
文件,我們只會(huì)用到 libboost_unit_test_framework-vc142-mt-gd-x64-1_73.lib
這一個(gè)文件。
當(dāng)然,如果只想編譯單元測(cè)試模塊,可以用下面的命令:
> b2 address-model=64 architecture=x86 --with-test link=static --prefix=build install
命令行編譯和測(cè)試
這里我們先在命令行里編譯C++項(xiàng)目,并運(yùn)行單元測(cè)試。 cd
到項(xiàng)目目錄下,然后執(zhí)行以下命令:
> mkdir build > cd build > cmake -G "Ninja" .. > ninja test_main > test_main.exe
在Windows平臺(tái)上,生成工具可以選擇VS提供的NMAKE,也可以用Ninja。微軟的NMAKE類似于Linux平臺(tái)的make工具。按照這個(gè) 視頻 的介紹,Ninja的編譯速度要比NMAKE快一些。
可以發(fā)現(xiàn),在 vcvars64.bat
所提供的環(huán)境下,使用的是VS所安裝的CMake和Ninja,版本號(hào)比我們自己安裝都要老一些。下面我們介紹如何在VS Code中配置C++的編譯和測(cè)試環(huán)境。
配置VS Code
settings.json
打開VS Code的設(shè)置,在 settings.json
中添加下面幾行內(nèi)容,可以起到類似 vcvars64.bat
的作用:
{ "terminal.integrated.shell.windows": "C:\\Windows\\System32\\cmd.exe", "terminal.integrated.env.windows": { "PATH" : "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\Hostx64\\x64;C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.18362.0\\x64;E:\\CMake\\bin;E:\\dev-lib\\ninja", "INCLUDE": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\include;C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\ucrt", "LIB": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\ATLMFC\\lib\\x64;C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\lib\\x64;C:\\Program Files (x86)\\Windows Kits\\10\\lib\\10.0.18362.0\\ucrt\\x64;C:\\Program Files (x86)\\Windows Kits\\10\\lib\\10.0.18362.0\\um\\x64" }, "cmake.cmakePath": "E:\\CMake\\bin\\cmake.exe" }
c_cpp_properties.json
這里給出Linux和Windows兩個(gè)平臺(tái)的配置。
{ "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}/**" ], "defines": [], "compilerPath": "/usr/bin/clang++", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "clang-x64" }, { "name": "Win32", "includePath": [ "${workspaceFolder}/**", "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\include", "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\ATLMFC\\include", "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\ucrt", "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\shared", "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\um", "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\winrt", "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\cppwinrt", "E:\\dev-lib\\boost_1_73_0" ], "defines": ["_DEBUG", "UNICODE", "_UNICODE"], "windowsSdkVersion": "10.0.18362.0", "compilerPath": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\Hostx64\\x64\\cl.exe", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "msvc-x64" } ], "version": 4 }
tasks.json
前兩個(gè) task
是Linux環(huán)境的(第一個(gè)是清空build目錄,第二個(gè)是配置CMake),第三個(gè) task
是Windows下配置CMake的。
{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "label": "clean", "type": "shell", "command": "rm -r build/*" }, { "label": "configure", "type": "shell", "command": "cmake", "args": [ "--no-warn-unused-cli", "-DCMAKE_C_COMPILER=/usr/bin/clang", "-DCMAKE_CXX_COMPILER=/usr/bin/clang++", "-DCMAKE_EXPORT_COMPILE_COMMANDS=TRUE", "-DCMAKE_BUILD_TYPE=Debug", "-H${workspaceFolder}", "-B${workspaceFolder}/build", "-G'Unix Makefiles'" ] }, { "label": "MSVC configure", "type": "shell", "command": "cmake", "args": [ "-H${workspaceFolder}", "-B${workspaceFolder}/build", "-GNinja" ] } ] }
launch.json
第一個(gè)是在Linux用 gdb
調(diào)試,第二個(gè)是在Linux下用 lldb
調(diào)試,第三個(gè)是在Windows用MSVC的 cl.exe
調(diào)試。
{ "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/build/test_main", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] }, { "name": "(lldb) Launch", "type": "lldb", "request": "launch", "program": "${workspaceFolder}/build/test_main", "args": [], }, { "name": "(cl) Launch", "type": "cppvsdbg", "request": "launch", "program": "${workspaceFolder}\\build\\test_main.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, } ] }
CMakeLists.txt
這個(gè)CMake腳本也是跨平臺(tái)的,自動(dòng)識(shí)別Linux或Windows,然后執(zhí)行相應(yīng)的鏈接。
cmake_minimum_required (VERSION 3.5) project(leetcode) set(PROBLEM_NAME "349-Intersection-of-Two-Arrays-set") set(CMAKE_CXX_STANDARD 14) set(SOLUTION_SOURCES ${PROJECT_SOURCE_DIR}/${PROBLEM_NAME}/solution.cpp) add_library(solution STATIC ${SOLUTION_SOURCES}) enable_testing() set(TEST_SOURCES ${PROJECT_SOURCE_DIR}/${PROBLEM_NAME}/solution_test.cpp) set(TEST_LIBS solution) add_executable(test_main ${TEST_SOURCES}) if(WIN32) message(STATUS "Detected Windows platform") set(BOOST_ROOT E:\\dev-lib\\boost_1_73_0) set(BOOST_LIBRARYDIR E:\\dev-lib\\boost_1_73_0\\build\\lib) set(Boost_USE_STATIC_LIBS ON) find_package(Boost REQUIRED COMPONENTS unit_test_framework) target_link_libraries(test_main PRIVATE ${TEST_LIBS} Boost::boost Boost::unit_test_framework) elseif(UNIX) message(STATUS "Detected UNIX platform") find_package(Boost REQUIRED COMPONENTS unit_test_framework) add_library(boost_unit_test_framework STATIC IMPORTED) set_target_properties(boost_unit_test_framework PROPERTIES IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a) target_link_libraries(test_main ${TEST_LIBS} boost_unit_test_framework) else() message(FATAL_ERROR "Unsupported platform") endif() add_test(solution_test test_main COMMAND test_main)
編譯、測(cè)試和調(diào)試
按快捷鍵 Ctrl
+ Shift
+ P
,然后就可以輸入我們之前定義的不同命令了:
單元測(cè)試的效果如下圖所示:
調(diào)試的效果如下圖所示:
看完上述內(nèi)容,是不是對(duì)Windows怎么配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章題目:Windows怎么配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境
分享鏈接:http://muchs.cn/article42/ipgdec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、電子商務(wù)、網(wǎng)頁(yè)設(shè)計(jì)公司、服務(wù)器托管、App設(shè)計(jì)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)