【问题标题】:Is there a way on VS Code to import Makefile projects?VS Code 有没有办法导入 Makefile 项目?
【发布时间】:2019-05-09 12:21:46
【问题描述】:

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

编辑:

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

Here 回购,尽情享受吧!

【问题讨论】:

  • 你可以搜索 VS Code Marketplace,但这似乎不太可能存在。您希望从您的 makefile 中导入哪些属性?
  • 搜索过了,但没有运气。问题是我有一个由软件(cubemx fot stm32)自动生成的嵌入式项目。该项目有一个makefile,我想通过VS Code打开它并获得建议,当我ctrl单击ecc时链接到文件。当我将它作为文件夹打开时,VS Code 抱怨未定义变量,因为它没有信息。我认为要让 linter 工作,它可能需要包含文件和源文件?
  • 感谢您的详细说明。尽管您的问题没有令人满意的答案,但我还是给出了一些可能对您有所帮助的提示。祝你好运!

标签: visual-studio-code makefile stm32 stm32cubemx


【解决方案1】:

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

在您的问题标题中,您提到了“Makefile 项目”,这表明您有错误的印象,即 (GNU) Makefiles 以类似于 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++ extension May 2018 Update – IntelliSense configuration just got so much easier!。这通常可以解决很多缺失的符号。如果您也在使用外部或第 3 方库,那么您必须手动将它们添加到您的 includePath 设置中,这是没有办法的。

此外,您可以创建 VS Code 任务来执行您喜欢的 make 命令。此处对此进行了解释:Integrate with External Tools via TasksMicrosoft C/C++ Extension 带有一组所谓的问题匹配器,它们解析命令的输出并可以为某些已知的编译器解释它。您将看到错误和警告的超链接,以直接导航到代码中的相关位置。

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

    {
        "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"
        ]
    }

【讨论】:

  • 谢谢,很好的回答。深入研究这个问题,我在这里找到了一个 makefile 解析器:github.com/platformio/builder-framework-libopencm3/blob/… 和一些有用的资源。我发现我的 c_cpp_properties 文件中缺少一个定义,现在 linter 正在按预期工作。以后我会自动化这个过程,再次感谢
  • 很高兴它帮助了@AndreaNisticò。啊,我忘记了#defines,这些确实也很重要。稍后,当我有更多时间时,我将在我的答案中添加该评论。 makefile 解析器看起来也很有趣,也会检查一下。
  • 我对未来的想法是为这种嵌入式项目创建一个 Makefile 模板,并用 python 脚本填充它。我什至可以将它翻译成 CMake,因为我非常喜欢它,但我需要更好地理解 Makefile。
【解决方案2】:

Visual Studio Code 的 C/C++ 智能感知扩展支持 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 分析应该使用完全正确的包含目录、定义指令和其他对每个单独的源文件唯一的命令行编译器标志。

【讨论】:

  • sudo pip install 可能会损坏 Linux 发行版安装的软件包。 pip install --user 不会。
  • bear 实用程序似乎可以很好地从 makefile 生成 compile_commands.json。 (在 Ubuntu 上,您可以使用 apt install bear 安装软件包)
【解决方案3】:

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

Here 回购,尽情享受吧!

【讨论】:

    【解决方案4】:

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

    您可以为此创建一个脚本,或者您可以从另一个 makefile 中执行此操作,例如:VSCode.mk 即您在顶级 Makefile 中的 include

    此解决方案使用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
    

    【讨论】:

      猜你喜欢
      • 2011-07-08
      • 2020-12-10
      • 1970-01-01
      • 2019-04-20
      • 2020-11-16
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      相关资源
      最近更新 更多