我正在从 Eclipse CDT 进行转换。当使用预处理器定义(无论是在 Makefile 中明确指定还是通过外部自动生成的头文件包含)浏览 C/C++ 代码时,预处理器宏功能是必须的。如果没有这个,就不可能浏览 Linux 源代码,如这个关于使用 Eclipse 研究 Linux 代码的开创性 wiki 页面 中所述。我正在寻找 Visual Studio Code 的等效功能。希望能指点一下。
截至今天,我发现 vscode-linux-kernel 项目的使用优于上面列出的两个答案,因为代码导航和智能感知效果非常好。
该项目已发布到公共领域。
这对我来说最有效(解决了之前的答案中片段的一些问题):
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/include",
"${workspaceFolder}/arch/<arch>/include",
"${workspaceFolder}/arch/<arch>/include/generated"
],
"forcedInclude": [
"${workspaceFolder}/BUILD/include/generated/autoconf.h"
],
"defines": [
"__KERNEL__"
],
"compilerPath": "/usr/bin/gg", # replace this with your compiler (also gcc cross-compiler)
"cStandard": "c11",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
您可以将
<arch>
替换为您的实际架构。
我不需要添加 arch 文件夹(对于 x86_64,它实际上是空的),但添加一些基本定义以使编译器特定类型和宏对智能感知可见。我的最小配置如下所示。为了获得完美的结果,您必须添加内核 .config 文件中配置的所有定义(例如 CONFIG_MMU)。其中有很多,因此通常您只会关注您真正关心的少数几个。
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/include"
],
"defines": [
"__GNUC__",
"__KERNEL__"
],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
Makefile Tool 为 Makefile 项目的 VS Code C/C++ 扩展提供 IntelliSense 配置。我们不必手动管理
c_cpp_properties.json
。
这是我所知道的在 VSCode 中使用 Linux 内核代码的最佳解决方案。
就我而言,上述答案都没有真正解决问题。这是我的解决方案。
C/C++ plugin
。clangd
插件。clang
构建内核:/path/to/kernel_source$ make CC=clang defconfig
/path/to/kernel_source$ make CC=clang -j16
compile_commands.json
:/path/to/kernel_source$ python ./scripts/clang-tools/gen_compile_commands.py
如果没有出现错误,您会在
compile_commands.json
中找到/path/to/kernel_source/
。
clangd
插件:或者将以下内容复制到您的settings.json:
{
"clangd.arguments": [
"--compile-commands-dir=${workspaceFolder}",
"--background-index",
"--completion-style=detailed",
"--header-insertion=never",
"-log=info",
"-pretty"
],
"clangd.path": "/usr/bin/clangd"
}
C
文件并享受它:)这些回复很有帮助,但是https://www.kernel.org/doc/html/latest/process/programming-language.html会表明
cStandard
应该是gnu11
(根据@pqnet的评论) ).