windows下vscode + code runner + cmake + msbuild.exe搭建C++快速编译环境

环境准备

  • 安装 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
  • settings.json 修改
F:/script/CMake_VSCode_build.bat $fileName $dir $fileNameWithoutExt
F:/script/CMake_VSCode_build.bat 这是我的bat文件的位置,这要根据文件实际位置去修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值