如何在Visual Studio Code中的构建目标之间切换?

时间:2019-02-02 17:08:58

标签: c++ c makefile visual-studio-code

我们正在尝试从Code :: Blocks迁移到Visual Studio Code以进行C / C ++开发。主要原因是通过IntelliSense提供更好的代码完成方式。但是,两者之间的比较不是这里的话题。

为了编译旧项目,我们在Visual Studio Code中设置了一个makefile和任务。到目前为止,一切正常。

事情变得复杂的地方是不同的构建目标。假设我们有一个示例项目,其中我们需要编译程序的两个版本,它们的95%相同。因此,在Code :: Blocks-times中,我们决定将所有内容保留在一个项目中,但通过define和ifdef区分不同的源代码位。因此,您选择适当的构建目标,该目标会将定义附加到gcc调用中,并构建二者的正确版本。为了使事情复杂一些,每个版本都有一个调试和发布目标。因此总共有四个构建目标:

  • 使用-DVERSION1 -DDEBUG构建的版本1调试
  • 使用-DVERSION1 -DRELEASE构建的第1版发布
  • 使用-DVERSION2 -DDEBUG构建的版本2调试
  • 使用-DVERSION2 -DRELEASE构建的第2版发布

因此,我们在VS Code中使用的makefile已设置完毕,我们还可以选择构建目标并构建正确的版本。到目前为止一切顺利。

现在,C / C ++扩展和IntelliSense开始发挥作用。他们使用clang即时“编译”代码以自动完成并突出显示实际使用的代码部分。因为我们针对不同版本的#define(VERSION1或VERSION2)仅在makefile中提供给gcc编译器,所以clang不知道它们。在不了解它们的情况下,代码段将显示为灰色(这没什么大不了的),但是自动完成也不适用于变量,而变量恰好在该部分中声明。

我们当然可以在c_cpp_properties.json中指定定义,也可以在其中创建不同的构建目标。但这意味着,我们需要在构建目标之间切换两次:首先是C / C ++扩展名,其次是makefile。我很确定,人们会彼此忘却并感到沮丧。

长话短说:有没有办法在Visual Studio Code中切换同时影响IntelliSense和实际构建的构建目标?

1 个答案:

答案 0 :(得分:1)

最后,我们找到了解决方案。实际上,我的一位同事确实找到了它。

我们需要修改三个文件才能使其正常工作。

c_cpp_properties.json需要不同构建目标的定义-在此文件中称为“配置”。进入c文件后,您可以在VS Code的右下方选择不同的配置。

{
    "configurations": [
        {
            "name": "DEBUG",
            "includePath": [
                 //...
            ],
            "defines": [
                 //...
            ],
            "compilerPath": "path/to/compiler",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x64"
        },
        {
            "name": "RELEASE",
            "includePath": [
                 //...
            ],
            "defines": [
                 //...
            ],
            "compilerPath": "path/to/compiler",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x64"
        }
    ]
}

tasks.json需要一个任务,该任务读取当前使用的c_cpp配置并将其作为参数传递给make文件。

{
    //...
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "make
            "args": [
                "CONFIG_NAME=${command:cpptools.activeConfigName}"
            ]
        }
    ]
}

最后,您可以在makefile中检查CONFIG_NAME并进行最终调整。下面仅是一个示例,它还不完整(从找不到我们要构建“ RELEASE”的“ DEBUG”中扣除可能有点大胆,但是您明白了)。当然,您还可以检查其他内容,或者可以匹配完整的配置名称。我们有很多c_cpp-configuration,它们遵循某种内部命名方案。如下所示的makefile中的概念使我们能够检查配置名称的不同部分,并在makefile中构建相应的标志。

# ...
ifneq (,$(findstring DEBUG,$(CONFIG_NAME)))
    CFLAGS += -DDEBUG
else
    CFLAGS += -DRELEASE
endif
# ...

再次,我需要承认这个解决方案实际上是我的同事找到的。