正如标题所述,我可以从现有的Makefile中自动填充c_cpp_properties.json吗?
答案 0 :(得分:6)
Visual Studio Code的C / C ++ Intellisense扩展支持compile_commands.json数据库。一些makefile实用程序可以自行生成这些数据库,但是我没有使用它们的经验。使用GNU make,您将需要某种帮助程序脚本或工具。我用的是python包的compedb:
sudo pip install compiledb
cd projectfolder
make clean
compiledb make
运行该命令之后,您应该最终得到一个compile_commands.json文件。然后,在VS Code中,您需要为有问题的工作区编辑c_cpp_properties.json。一种打开方法是单击状态栏右下角的配置名称,然后单击“编辑配置(json)”。或者,您可以打开命令参数栏(在我的系统上为CTRL + SHIFT + P),然后输入C/C++: Edit configurations (JSON)
然后,在您使用的配置中,添加属性"compileCommands": "${workspaceFolder}/compile_commands.json"
完整示例:
{
"configurations": [
{
"name": "geany",
"includePath": [
"${workspaceFolder}/**"
],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64",
"browse": {
"path": [
"${workspaceFolder}/**"
],
"limitSymbolsToIncludedHeaders": true
},
"compileCommands": "${workspaceFolder}/compile_commands.json"
}
],
"version": 4
}
现在,Visual Studio代码的Intellisense分析应该使用完全正确的包含目录,define指令和每个单独的源文件唯一的其他命令行编译器标志。
答案 1 :(得分:2)
此答案可能不会完全为您提供所需的内容,但希望它可以帮助您设置VS Code环境。
在问题标题中,您提到“ Makefile项目”,这表明您对(GNU)Makefile以类似于Visual Studio项目文件的方式捕获项目设置的印象不正确。 Makefile不能那样工作,对您问题的简短回答是“否”,似乎没有一种方法可以将“ Makefile”“导入”到VS Code中,并使其自动在您的c_cpp_properties.json
文件中设置值。
话虽如此,根据您工具链中的其他元素,还有一些其他机制可以帮助您根据情况开始使用VS Code。
VS Code的前提是它在文件系统中打开一个或多个目录。这样做时,它将自动扫描其所有子目录,显示树并进行整理(如果启用)以检测问题。实际上,需要手动将包含目录添加到您的c_cpp_properties.json
文件中,但是要将所有子目录递归添加到包含目录列表中,则可以使用表达式
"${workspaceRoot}/**"
作为includePath
设置中的元素之一。有关更多详细信息,请参见博客文章Visual Studio Code C/C++ extension May 2018 Update – IntelliSense configuration just got so much easier!。这通常可以解决许多缺少的符号。如果您还使用外部库或第三方库,则必须将它们手动添加到includePath
设置中,无法解决。
此外,您可以根据自己的喜好创建VS代码任务来执行make
命令。此处说明:Integrate with External Tools via Tasks。 Microsoft C/C++ Extension带有一组所谓的ProblemMatchers,它们可以解析命令的输出并可以为某些已知的编译器解释该输出。您将看到超链接,其中包含错误和警告,可直接导航到代码中的关联位置。
此类任务的示例可能如下所示:
{
"label": "Build All Debug",
"type": "shell",
"command": "make -f path/to/Makefile DEBUG=1",
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"reveal": "always",
"panel": "new"
},
"problemMatcher": [
"$gcc"
]
}
答案 2 :(得分:1)
GNU Make通常用于编译C项目,但它可以生成所需的任何类型的输出文件。
您可以为此目的创建脚本,也可以从另一个生成文件中创建脚本,例如:VSCode.mk
您include
在顶层Makefile
中。
此解决方案正在使用One Shell,但如果这样做不可行,那么单独的脚本看起来会更好。
@使您的输出更好。
很可能您不能安全地复制粘贴此代码,因为Make使用的是文字标签,而不是空格。
.ONESHELL:
SOURCE_DIRECTORY := src
DEFINED_VALUE := 1
# Recipe:
.vscode/c_cpp_properties.json:
@
cat << EOF > "$@"
{
"configurations": [
{
"name": "Linux",
"includePath": [
"\$${workspaceFolder}/$(SOURCE_DIRECTORY)*"
],
"defines": [
"DEFINED_VALUE=$(DEFINED_VALUE)"
],
"compilerPath": "$(CC)",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64",
"browse" : {
"limitSymbolsToIncludedHeaders" : true
}
}
],
"version": 4
}
EOF
答案 3 :(得分:0)
对于其他尝试导入makefile的人,我发现了一组脚本,这些脚本完全可以实现我想要实现的功能,即通过VS Code管理STM32嵌入式项目。如果您深入到scripts文件夹,则可以找到make解析器和VSCode项目文件填充器。
Here回购,尽情享受!