VS Code 有没有办法导入 Makefile 项目?
Is there a way on VS Code to import Makefile projects?
如标题所说,我可以从现有的 Makefile 自动填充 c_cpp_properties.json 吗?
编辑:
对于其他尝试导入 makefile 的人,我找到了一组脚本,它们完全可以执行我想要实现的目标,即通过 VS Code 管理 STM32 嵌入式项目。如果深入研究脚本文件夹,您可以找到 make 解析器和 VSCode 项目文件填充器。
Here 回购,享受吧!
此答案可能无法完全满足您的需求,但希望它能帮助您设置 VS Code 环境。
在您的问题标题中,您提到了 "Makefile projects",这表明您错误地认为 (GNU) Makefile 以类似于 Visual Studio 项目文件的方式捕获项目设置。 Makefiles 不像那样工作,对你的问题的简短回答是不,似乎没有办法将 "import" Makefiles 放入 VS Code 并让它自动在你的 c_cpp_properties.json
文件中设置值。
话虽如此,根据您的工具链中的其他元素,还有一些其他机制可以帮助您在您的情况下开始使用 VS Code。
VS Code 的工作前提是它会在你的文件系统中打开一个或多个目录。当您这样做时,它会自动扫描其所有子目录,显示树并执行 linting(如果启用)以检测问题。实际上,包含目录需要手动添加到您的 c_cpp_properties.json
文件,但要将所有子目录递归添加到包含目录列表,您可以使用表达式
"${workspaceRoot}/**"
作为 includePath
设置中的元素之一。有关详细信息,请参阅博客 post Visual Studio Code C/C++ extension May 2018 Update – IntelliSense configuration just got so much easier!。这通常可以解决很多缺失的符号。如果您也在使用外部或第 3 方库,那么您必须手动将它们添加到 includePath
设置中,没有办法解决这个问题。
此外,您可以创建 VS 代码任务来执行您喜欢的 make
命令。这在此处解释:Integrate with External Tools via Tasks. The Microsoft C/C++ Extension 附带一组 so-called 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"
]
}
对于其他尝试导入 makefile 的人,我找到了一组脚本,它们完全可以执行我想要实现的目标,即通过 VS Code 管理 STM32 嵌入式项目。如果深入研究脚本文件夹,您可以找到 make 解析器和 VSCode 项目文件填充器。
Here 回购,享受吧!
Visual Studio C/C++ 的 Code 智能感知扩展支持 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。打开它的一种方法是单击状态栏右下角的配置名称,然后单击 "Edit Configurations (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 分析应该使用完全正确的 include 目录、define 指令和每个源文件独有的其他命令行编译器标志。
GNU Make 通常用于编译 C 项目,但它可以生成您想要的任何类型的输出文件。
您可以为此目的创建一个脚本,或者您可以从另一个 makefile 执行此操作,例如: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
如标题所说,我可以从现有的 Makefile 自动填充 c_cpp_properties.json 吗?
编辑:
对于其他尝试导入 makefile 的人,我找到了一组脚本,它们完全可以执行我想要实现的目标,即通过 VS Code 管理 STM32 嵌入式项目。如果深入研究脚本文件夹,您可以找到 make 解析器和 VSCode 项目文件填充器。
Here 回购,享受吧!
此答案可能无法完全满足您的需求,但希望它能帮助您设置 VS Code 环境。
在您的问题标题中,您提到了 "Makefile projects",这表明您错误地认为 (GNU) Makefile 以类似于 Visual Studio 项目文件的方式捕获项目设置。 Makefiles 不像那样工作,对你的问题的简短回答是不,似乎没有办法将 "import" Makefiles 放入 VS Code 并让它自动在你的 c_cpp_properties.json
文件中设置值。
话虽如此,根据您的工具链中的其他元素,还有一些其他机制可以帮助您在您的情况下开始使用 VS Code。
VS Code 的工作前提是它会在你的文件系统中打开一个或多个目录。当您这样做时,它会自动扫描其所有子目录,显示树并执行 linting(如果启用)以检测问题。实际上,包含目录需要手动添加到您的 c_cpp_properties.json
文件,但要将所有子目录递归添加到包含目录列表,您可以使用表达式
"${workspaceRoot}/**"
作为 includePath
设置中的元素之一。有关详细信息,请参阅博客 post Visual Studio Code C/C++ extension May 2018 Update – IntelliSense configuration just got so much easier!。这通常可以解决很多缺失的符号。如果您也在使用外部或第 3 方库,那么您必须手动将它们添加到 includePath
设置中,没有办法解决这个问题。
此外,您可以创建 VS 代码任务来执行您喜欢的 make
命令。这在此处解释:Integrate with External Tools via Tasks. The Microsoft C/C++ Extension 附带一组 so-called 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"
]
}
对于其他尝试导入 makefile 的人,我找到了一组脚本,它们完全可以执行我想要实现的目标,即通过 VS Code 管理 STM32 嵌入式项目。如果深入研究脚本文件夹,您可以找到 make 解析器和 VSCode 项目文件填充器。
Here 回购,享受吧!
Visual Studio C/C++ 的 Code 智能感知扩展支持 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。打开它的一种方法是单击状态栏右下角的配置名称,然后单击 "Edit Configurations (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 分析应该使用完全正确的 include 目录、define 指令和每个源文件独有的其他命令行编译器标志。
GNU Make 通常用于编译 C 项目,但它可以生成您想要的任何类型的输出文件。
您可以为此目的创建一个脚本,或者您可以从另一个 makefile 执行此操作,例如: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