Windows配置VSCode+CMake+Ninja+Boost.Test的C++开发环境(教程详解)

2020-05-12 11:57:48于海丽

平时习惯了在Linux环境写C++,有时候切换到Windows想继续在同一个项目上工作,重新配置环境总是很麻烦。虽然Windows下用Visual Studio写C++只需要双击个图标,但我还是想折腾一下VS Code的环境配置。原因主要有两点:一是个人习惯上各种语言都在VS Code里面写,利用Git同步代码可以很方便地在不同平台开发同一个项目;二是有些情形下无法使用图形化界面,比如为Git配置CI(持续性集成)时显然不能用Visual Studio这个图形化的IDE来执行Windows环境的测试。

本文涉及的环境和工具版本:

Windows 10 VS Code 1.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 (需要调用VS提供的MSVC编译工具,以及相应的头文件和库文件) CMake 3.17.2 Ninja 1.10.0 Boost 1.73.0

主要内容

1 创建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 编译、测试和调试

创建C++项目

VSCode及插件的安装过程本文暂不介绍,这里直接给出项目的文件结构和代码。

项目结构如下。 .vscode 文件夹里面的3个json文件用来配置VS Code,第二个文件夹里面包含对LeetCode某一个问题的解答( solution.hppsolution.cpp ), solution_test.cpp 用来执行单元测试。最下面的 CMakeLists.txt 文件用来配置CMake,给出项目的编译规则。

这里先给出C++部分的代码,其他文件的内容会在后面给出。

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());
}