平時習慣了在Linux環(huán)境寫C++,有時候切換到Windows想繼續(xù)在同一個項目上工作,重新配置環(huán)境總是很麻煩。雖然Windows下用Visual Studio寫C++只需要雙擊個圖標,但我還是想折騰一下VS Code的環(huán)境配置。原因主要有兩點:一是個人習慣上各種語言都在VS Code里面寫,利用Git同步代碼可以很方便地在不同平臺開發(fā)同一個項目;二是有些情形下無法使用圖形化界面,比如為Git配置CI(持續(xù)性集成)時顯然不能用Visual Studio這個圖形化的IDE來執(zhí)行Windows環(huán)境的測試。
本文涉及的環(huán)境和工具版本:
- Windows 10
- VS Code1.45.0
- C/C++(ms-vscode.cpptools)插件0.28.0.insider3
- CMake(twxs.cmake)插件0.0.17
- CMake Tools(ms-vscode.cmake-tools)插件1.3.1
- Visual Studio IntelliCode(visualstudioexptteam.vscodeintellicode)插件1.2.7
- Visual Studio Community 2019 (需要調(diào)用VS提供的MSVC編譯工具,以及相應的頭文件和庫文件)
- CMake3.17.2
- Ninja 1.10.0
- Boost1.73.0
主要內(nèi)容
1 創(chuàng)建C++項目
2 安裝Visual Studio
3 安裝CMake和Ninja
4 下載和編譯Boost
4.1 Command Prompt的使用
4.2 編譯Boost
5 命令行編譯和測試
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 編譯、測試和調(diào)試
創(chuàng)建C++項目
VSCode及插件的安裝過程本文暫不介紹,這里直接給出項目的文件結構和代碼。
項目結構如下。 .vscode
文件夾里面的3個json文件用來配置VS Code,第二個文件夾里面包含對LeetCode某一個問題的解答( solution.hpp
和 solution.cpp
), solution_test.cpp
用來執(zhí)行單元測試。最下面的 CMakeLists.txt
文件用來配置CMake,給出項目的編譯規(guī)則。
這里先給出C++部分的代碼,其他文件的內(nèi)容會在后面給出。
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的安裝過程,只是提示一下需要安裝的組件。
需要注意Visual Studio Community 2019 Preview版本在編譯Boost不能被正確識別,需要安裝正式版。Visual Studio Community 2017/2019 兩個版本我都試驗過,這里以2019版本為例。
只需要安裝“使用C++的桌面開發(fā)”這一套組件就可以了。
安裝CMake和Ninja
CMake可以下載名為cmake-3.17.2-win64-x64.msi 的安裝包來安裝,Ninja下載之后只有一個可執(zhí)行文件,可以隨意放在一個目錄下。
安裝過程暫不詳述,只需要注意安裝完成之后要設置一下環(huán)境變量。
設置好環(huán)境變量之后,可以重新打開命令行工具或終端,檢查一下CMake和Ninja的版本,看是否設置成功。
下載和編譯Boost
Boost可以從這個鏈接下載: https://dl.bintray.com/boostorg/release/1.73.0/source/ ,然后解壓到某個目錄下。
Boost本身是header-only的,即大部分情況下只需要包含其頭文件就能直接調(diào)用。但為了便于把我們自己的程序鏈接到Boost的單元測試模塊(Boost.Test),這里需要編譯一下Boost,產(chǎn)生靜態(tài)庫文件。
Command Prompt的使用
由于我們之前已經(jīng)安裝了Visual Studio以及在Windows平臺編譯C++所需的編譯工具和依賴庫,所以我們可以直接利用VS提供的環(huán)境來編譯Boost。
在開始菜單的“Visual Studio 2019”目錄下可以發(fā)現(xiàn)幾個命令行工具,我們可以打開一個名為“x64 Native Tools Command Prompt for VS 2019”的命令行工具,這個圖標在硬盤上對應到 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat
這個腳本。該腳本的作用是把MSVC和Windows SDK的包含路徑、庫路徑等添加到環(huán)境變量,然后打開一個cmd命令行。所以在這個cmd運行期間能夠直接檢測到編譯C++所需的所有依賴項。
我們可以試著在這個cmd當中輸入 SET
,查看已經(jīng)生效的所有環(huán)境變量。
利用這些信息,我們在常規(guī)的cmd或PowerShell里也能正常編譯C++代碼。具體的過程會在后面介紹。
默認cmd的字體有點難看,我個人習慣在Windows Terminal 里面開一個cmd終端,然后執(zhí)行下面的命令:
> "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
這就可以讓我們的新終端也能夠檢測到MSVC環(huán)境,如下圖所示。
編譯Boost
然后, cd
到Boost的根目錄,執(zhí)行下面的命令:
- > bootstrap.bat
- > b2 --prefix=build install
等待編譯完成之后,在 build\lib
目錄下會出現(xiàn)一大堆 .lib
文件,我們只會用到 libboost_unit_test_framework-vc142-mt-gd-x64-1_73.lib
這一個文件。
當然,如果只想編譯單元測試模塊,可以用下面的命令:
- > b2 address-model=64 architecture=x86
- --with-test link=static --prefix=build install
命令行編譯和測試
這里我們先在命令行里編譯C++項目,并運行單元測試。 cd
到項目目錄下,然后執(zhí)行以下命令:
- > mkdir build
- > cd build
- > cmake -G "Ninja" ..
- > ninja test_main
- > test_main.exe
在Windows平臺上,生成工具可以選擇VS提供的NMAKE,也可以用Ninja。微軟的NMAKE類似于Linux平臺的make工具。按照這個 視頻 的介紹,Ninja的編譯速度要比NMAKE快一些。
可以發(fā)現(xiàn),在 vcvars64.bat
所提供的環(huán)境下,使用的是VS所安裝的CMake和Ninja,版本號比我們自己安裝都要老一些。下面我們介紹如何在VS Code中配置C++的編譯和測試環(huán)境。
配置VS Code
settings.json
打開VS Code的設置,在 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兩個平臺的配置。
- {
- "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
前兩個 task
是Linux環(huán)境的(第一個是清空build目錄,第二個是配置CMake),第三個 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
第一個是在Linux用 gdb
調(diào)試,第二個是在Linux下用 lldb
調(diào)試,第三個是在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
這個CMake腳本也是跨平臺的,自動識別Linux或Windows,然后執(zhí)行相應的鏈接。
- 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)
編譯、測試和調(diào)試
按快捷鍵 Ctrl
+ Shift
+ P
,然后就可以輸入我們之前定義的不同命令了:
- “CMake: Configure” – 配置CMake
- “CMake: Build” – 編譯項目
- “CMake: Run tests” – 執(zhí)行測試
- “Tasks: Run task -> MSVC configure” – 以調(diào)用Task的方式配置CMake
單元測試的效果如下圖所示:
調(diào)試的效果如下圖所示:
完整的項目代碼在我的GitHub上: https://github.com/johnhany/leetcode 。關于Linux平臺下C++開發(fā)環(huán)境的配置可以參考 《Ubuntu計算機視覺開發(fā)環(huán)境配置(Python/C++)》 。
總結
到此這篇關于Windows配置VSCode+CMake+Ninja+Boost.Test的C++開發(fā)環(huán)境(教程詳解)的文章就介紹到這了,更多相關VScode配置C/C++環(huán)境內(nèi)容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:http://johnhany.net/2020/05/vscode-cmake-ninja-boost-test-cpp-on-windows/