我们正在尝试从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和实际构建的构建目标?
答案 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
# ...
再次,我需要承认这个解决方案实际上是我的同事找到的。