环境准备
- 安装 visual studio
- 安装 VS code
- VS code 安装 code runner 插件
直接编译不通过CMake
- 无需安装Cmake
- 通过预设的环境进行编译
- 这种方法有时候链接windows库会有问题, 但是比CMake + msbuild.exe要快很多。觉得这种方法足够了的话,后面通过CMake + msbuild.exe 搭建vscode编译工具的方法可以不用看了。
CMake + msbuild.exe 搭建vscode编译工具
- 这种方法首先通过CMake创建一个visual studio工程,然后再用msbuild根据工程配置编译
- msbuild编译参考
- CMake创建工程首先需要一个cmakelists.txt文件,因为我的需求是快速编译某个目录下的cpp文件,所以用python写了一个生成cmakelist.txt的脚本。这个脚本要指定cpp文件,并找到当前目录下cpp已经包含的头文件和头文件对应的源文件(源文件和头文件的名称要一样),将这些文件组织成cmakelists.txt。要用python3去运行脚本。
import sys
import os
class CMakeLists(object):
def __init__(self, main_file:str, proj_path: str):
self.main_file = main_file
self.proj_path = proj_path
if main_file.endswith(".cpp"):
self.proj_name:str = main_file[:-4]
else:
self.proj_name:str = main_file[:-2]
self.source_files = [main_file]
def _parseIncludes(self, header_file_name: str):
#添加当前目录下的文件到source_files里
path_split_char = '/' if '/' in header_file_name else '\\'
lst = header_file_name.split(path_split_char)
if len(lst) > 2:
return
elif len(lst) == 2 and lst[0] != ".":
return
h_file = lst[-1]
h_name = h_file[:-4] if h_file.endswith(".hpp") else h_file[:-2]
c_file = f"{h_name}.c"
cpp_file = f"{h_name}.cpp"
for file_name in [h_file, c_file, cpp_file]:
if os.path.exists(os.path.join(self.proj_path, file_name)):
self.source_files.append(file_name)
def _createCmakeList(self):
with open("cmakelists.txt", "w") as f:
#检查版本
f.write("cmake_minimum_required(VERSION 3.10.0)\n")
#设置工程名
f.write(f"project({self.proj_name})\n")
#设置C++标准
f.write("set(CMAKE_CXX_STANDARD 17)\n")
f.write("set(CMAKE_CXX_STANDARD_REQUIRED ON)\n")
f.write("set(CMAKE_CXX_EXTENSIONS OFF)\n") # 开启编译器的特定的扩展,ON便是只用ISO C++ 标准
#设置输出路径
f.write("set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})\n")
#添加需要编译的文件
file_lst = ""
for cpp_file in self.source_files:
file_lst += " "
file_lst += cpp_file
f.write("set(FILE_LIST%s)\n" % file_lst)
#编译文件
f.write("add_executable(%s ${FILE_LIST})" % self.proj_name)
def generate(self):
with open(self.main_file, 'r') as f:
lines = f.readlines()
for line in lines:
line = line.strip()
if line.find("#include") == 0:
index_1 = line.find('"')
index_2 = line.find('"', index_1 + 1)
substr = line[index_1 + 1 : index_2]
self._parseIncludes(substr)
self._createCmakeList()
def main():
args = sys.argv
if (len(args) < 3):
assert False
main_file = args[1]
proj_path = args[2]
if main_file.endswith(".cpp") or main_file.endswith(".c"):
if main_file.startswith(".\\"):
main_file = main_file[2:]
cmake_list = CMakeLists(main_file, proj_path)
cmake_list.generate()
else:
assert False
if __name__ == "__main__":
main()
- 然后设置code runner 的配置,vs code依次点击 File->Preferences->Settings->Extensions->Run Code configuration->Executor Map->Edit in settings.json, 修改“cpp"配置如下
"F:/script/CMake_VSCode_build.bat $fileName $dir $fileNameWithoutExt"
- CMake_VSCode_build.bat 是执行生成cmake list和编译执行exe文件的脚本, 内容如下,注意这里MSBuild.exe和cmake -G "Visual Studio 16 2019"是对应的。
cd %2
python %USERPROFILE%\work\tool\P-Tools\Implements\CMakeAssistant.py %1 %2
mkdir build
cd build
cmake -G "Visual Studio 16 2019" ..
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe" ALL_BUILD.vcxproj
cd ..
del cmakelists.txt
RD /S /Q build
%2\Debug\%3.exe
- 以上配置完成后,code runner 会在cpp文件所在路径生成Debug目录,生成的exe文件和pdb文件都将放在这里。
Run in Terminal
- 上面的步骤已经能够让code runner够通过cmake和msbuild编译文件。但是后来使用时发现多线程的情况下code runner的输出有问题。于是试着开启Run in Terminal,但是前面settings.json里配置的命令被code runner 转义之后power shell无法识别了。于是就重新写了bat文件,然后settings.json的命令修改成执行bat文件。
- bat 文件
cd %2
python F:\script\CMakeAssistant.py %1 %2
mkdir build
cd build
cmake ..
MSBuild.exe ALL_BUILD.vcxproj
cd ..
del cmakelists.txt
RD /S /Q build
%2\Debug\%3.exe
F:/script/CMake_VSCode_build.bat $fileName $dir $fileNameWithoutExt
F:/script/CMake_VSCode_build.bat 这是我的bat文件的位置,这要根据文件实际位置去修改。