12

正如标题所说,我可以从现有的 Makefile 中自动填充 c_cpp_properties.json 吗?

编辑:

对于其他尝试导入 makefile 的人,我找到了一组脚本,它们完全可以执行我想要实现的目标,即通过 VS Code 管理 STM32 嵌入式项目。如果您深入脚本文件夹,您可以找到 make 解析器和 VSCode 项目文件填充器。

这里是回购,享受!

4

4 回答 4

18

这个答案可能无法完全满足您的需求,但希望它可以帮助您设置 VS Code 环境。

在您的问题标题中,您提到了“Makefile 项目”,这表明您对(GNU)Makefile 以类似于 Visual Studio 项目文件的方式捕获项目设置有错误的印象。Makefile 不能那样工作,对您的问题的简短回答是不,似乎没有办法将 Makefile“导入”到 VS Code 并让它自动在您的c_cpp_properties.json文件中设置值。

话虽如此,根据您的工具链中的其他元素,还有一些其他机制可以帮助您在您的情况下开始使用 VS Code。

VS Code 的工作前提是它会在你的文件系统中打开一个或多个目录。当您这样做时,它将自动扫描其所有子目录,显示树并进行 linting(如果启用)以检测问题。实际上,包含目录需要手动添加到您的c_cpp_properties.json文件中,但是要将所有子目录递归添加到包含目录列表中,您可以使用表达式

"${workspaceRoot}/**"

includePath作为您设置中的元素之一。请参阅博文Visual Studio Code C/C++ 扩展 2018 年 5 月更新 – IntelliSense 配置变得如此简单!更多细节。这通常可以解决很多缺失的符号。如果您也在使用外部或 3rd 方库,那么您必须includePath手动将它们添加到您的设置中,这是没有办法的。

此外,您可以创建 VS Code 任务来执行make您喜欢的命令。此处对此进行了解释:通过任务与外部工具集成Microsoft C/C++ 扩展附带一组所谓的问题匹配器,它们解析命令的输出并可以为某些已知的编译器解释它。您将看到错误和警告的超链接,以直接导航到代码中的关联位置。

此类任务的示例可能如下所示:

    {
        "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"
        ]
    }
于 2018-12-08T22:11:50.780 回答
9

Visual Studio Code 的 C/C++ Intellisense 扩展支持 compile_commands.json 数据库。一些 makefile 实用程序可以自己生成这些数据库,但我没有任何使用它们的经验。使用 GNU make,您将需要某种帮助脚本或工具。我使用了python包compiledb:

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 分析应该使用完全正确的包含目录、定义指令和其他对每个单独的源文件唯一的命令行编译器标志。

于 2020-01-06T20:26:51.513 回答
2

对于其他尝试导入 makefile 的人,我找到了一组脚本,它们完全可以执行我想要实现的目标,即通过 VS Code 管理 STM32 嵌入式项目。如果您深入脚本文件夹,您可以找到 make 解析器和 VSCode 项目文件填充器。

这里是回购,享受!

于 2018-12-11T13:39:15.323 回答
1

GNU Make 通常用于编译 C 项目,但它可以生成您想要的任何类型的输出文件。

您可以为此目的创建一个脚本,或者您可以从另一个 makefile 中执行此操作,例如:VSCode.mkinclude在顶层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
于 2020-07-11T08:07:27.780 回答