vscode c++ tasks.json支持linux和windows端混合编译

vscode c++ tasks.json支持linux和windows端混合编译,第1张

        本文主要介绍class="superseo">vscode在编译c++时,tasks.json如何编写,本文的最后附带编写的支持linux端和windows端的通用tasks.json给大家参考。


        vscode作为一款免费的代码编辑器,其简洁的界面受到了很多人的青睐。


当然,这里的很多人包括了我,使用了vscode将近1年,安利理由:简单、轻巧、跨平台、支持远程编译(wsl、ssh、docker container)

我所用到的项目使用了cmake对工程文件进行组织,在windows端使用msbuild15,linux端使用gcc-4.8.5进行编译,目标通过编写一个通用的tasks.json对不同平台的工程进行编译。


tasks.json的编写规则,需要参考官网配置,本文将对官网内容进行引导,并最终附带编写的任务。


1.创建tasks.json

可以选择手动创建在.vscode/,或者在菜单栏中自动创建,创建内容选择others即可,内容我们手动填写:

2.linux端编译:

该配置中可配置若干任务,完成对工程的编译,这里我们需要创建一个build文件夹作为编译程序路径,然后使用的cmake对工程进行组织并生成makefile,最后使用g++/gcc根据makefile对工程进行编译,那么task可以分为三个任务,第一个CreateBuildDir,第二个cmake,第三个build。


那么这三个任务依次形成了依赖关系。


3.windows端编译:

windows端使用的msbuild进行编译,根据Microsoft C++ on Windows给出的方案“In certain circumstances, it isn't possible to run VS Code from Developer Command Prompt for Visual Studio (for example, in Remote Development through SSH scenarios). In that case, you can automate initialization of Developer Command Prompt for Visual Studio during the build using the following tasks.json configuration”

        可以通过在启动菜单中运行vs命令行工具(主要目的对vs的编译器内核所需要的环境变量进行配置,微软官方不建议用户将编译器所需要的环境变量写入计算机环境变量中)运行vscode调用msbuild进行编译

        考虑到在远程编译以及配置繁琐,官方给出了第二中方案在“tasks.json”加入以下内容:

// 官方示例:
{
  "version": "2.0.0",
  "windows": {
    "options": {
      "shell": {
        "executable": "cmd.exe",
        "args": [
          "/C",
          // 以下路径应根据安装编译器实际情况进行修改,将vs编译器所需环境变量引入vscode中
          "\"C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/Tools/VsDevCmd.bat\"",
          "&&"
        ]
      }
    }
  },
  "tasks": [
    {
      "type": "shell",
      "label": "cl.exe build active file",
      "command": "cl.exe",
      "args": [
        "/Zi",
        "/EHsc",
        "/Fe:",
        "${fileDirname}\${fileBasenameNoExtension}.exe",
        "${file}"
      ],
      "problemMatcher": ["$msCompile"],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}

接下来对windows端的编译就和linux端无太多差异了,最后提供支持windows端和linux端通用的tasks.json配置给大家参考:

{
    "version": "2.0.0",
    "windows": {
      "options": {
        "shell": {
            // 此处需要使用cmd.exe,而非powershell,在vs环境变量配置过程中,后者存在问题
          "executable": "cmd.exe",
          "args": [
            "/C",
            // 根据安装路径对vs进行配置,我已经安装了vs2017
            "\"C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/Tools/VsDevCmd.bat\"",
            "&&"
          ]
        }
      }
    },
    "tasks": [
        {
            "type": "shell",
            "label": "CreateBuildDir",
            // 区分windows平台进行创建编译路径
            "windows":{
                "command": "mkdir",
                "args": [
                    "build"
                ],
            },
            // 区分linux平台进行创建编译路径
            "linux":{
                "command": "mkdir",
                "args": [
                    "-p",
                    "build"
                ],
            },
            // 指定工作路径
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
        },
        {
            "type": "shell",
            "label": "cmake",
            "windows": {
                "command": "cmake",
                "args": [
                    // 指定系统类型64位
                    "-A",
                    "x64",
                    // 指定编译类型,不指定,默认Debug
                    "-DCMAKE_CONFIGURATION_TYPES=RelWithDebInfo",
                    "-DCMAKE_PREFIX_PATH=D:\Qt\Qt5.9.2\5.9.2\msvc2017_64",
                    "../"
                ]
            },
            "linux": {
                "command": "cmake",
                "args": [
                    "..",
                    "-DCMAKE_BUILD_TYPE=Debug",    
                    // 指定cmake补丁路径,用于查找可执行程序,linux端需要注意一点,如果在DCMAKE_PREFIX_PATH中有多个路径除了需要使用“;”间隔以外,需要在路径加入\",linux端对""双引号敏感,否则cmake执行错误
                    "-DCMAKE_PREFIX_PATH=\"/opt/Qt5.9.8/5.9.8/gcc_64\"",
                    "-DTRAFFICCONTROL=1",
                    "-DProtobuf_INCLUDE_DIR=\"/usr/local/lib/protobuf/src\"",
                    "-DProtobuf_LIBRARY=\"/usr/local/lib/protobuf/build/libprotobuf.a\"",
                    "-DBOOST_ROOT=\"/usr/local/boost\"",
                    "-DBOOST_INCLUDEDIR=\"/usr/local/boost/include/boost\"",
                    "-DBOOST_LIBRARYDIR=\"/usr/local/boost/lib\""
                ],  
                // 依赖第一个创建编译路径任务
                "dependsOn": [
                "CreateBuildDir"
                ]
            },
            "options": {
                "cwd": "${workspaceFolder}/build"
            },
            "problemMatcher": []
        },
        {
            "type": "shell",
            "label": "build",
            "windows":{
                "command": "msbuild",
                "args": [
                // 在cmake组织文件后需要指定xxx.sln工程
                  "xxx.sln",
      	        	"/p:Platform=x64",
      	        	"/m:10",
      	        	"/v:minimal",
      	        	"-p:MinimalRebuild=true"
                ]
            },
            "linux":{
                "command": "make",
                "args": [
                    "-j$(nproc)"
                ]
            },
            "options": {
                "cwd": "${workspaceFolder}/build"
            },
            // 依赖cmake任务
            "dependsOn": [
                "cmake"
            ]
        }
    ]
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/579269.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存