在 VS Code 中开发 Linux 内核模块时,我偶然发现了一个有趣的行为。
有了这个
c_cpp_properties.json
:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/src/linux-headers-5.15.0-91-generic/arch/x86/include",
"/usr/src/linux-headers-5.15.0-91-generic/arch/x86/include/generated",
"/usr/src/linux-headers-5.15.0-91-generic/include",
"/usr/src/linux-headers-5.15.0-91-generic/arch/x86/include/uapi",
"/usr/src/linux-headers-5.15.0-91-generic/arch/x86/include/generated/uapi",
"/usr/src/linux-headers-5.15.0-91-generic/include/uapi",
"/usr/src/linux-headers-5.15.0-91-generic/include/generated/uapi",
"/usr/src/linux-headers-5.15.0-91-generic/ubuntu/include",
"/usr/lib/gcc/x86_64-linux-gnu/9/include"
],
"defines": [
"__GNUC__",
"__KERNEL__"
],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c17",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
一切正常:所有
#include <linux/...>
都得到正确解决。
有了这个
c_cpp_properties.json
:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/src/linux-headers-5.15.0-91-generic/**",
"/usr/lib/gcc/x86_64-linux-gnu/9/include"
],
"defines": [
"__GNUC__",
"__KERNEL__"
],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c17",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
我收到的错误基本上是说几乎所有(如果不是全部)我的内核特定结构、函数和宏都未定义。
这是为什么? 第二个配置应该包含第一个配置的所有路径。
我想我可以重现这个(不确定是否完全相同的原因)。我无法说出原因,但我想我找到了解决方法:
我可以通过使用
/.../**/*
而不是 /.../**
来获得递归性。
虽然这有点......沉重和凌乱。除非你真的想要完全递归,否则我可以建议你这样做吗?
"/usr/src/linux-headers-<version>-generic/**/include",
"/usr/src/linux-headers-<version>-generic/**/include/generated",
"/usr/src/linux-headers-<version>-generic/**/include/uapi",
"/usr/src/linux-headers-<version>-generic/**/include/generated/uapi",