如何在 c 中为 non-kernel 应用程序指定内核 headers 的路径?

How to specify path of kernel headers for non-kernel app in c?

我需要使用 ioctlfixp_t 类型的数字(定义在 <linux/fixp-arith.h>,最初是 s16)从内核模块传输到客户端应用程序。数据类型非常重要,如果变量大小不同 - 结果可能非常危险。

如果我在内核和客户端应用程序源代码中都包含 <linux/fixp-arith.h>,客户端应用程序将无法编译,因为它找不到 linux headers.

另一方面,gcc -I/usr/src/linux-headers-3.16.0-4-common/include/ app.c -o app 不起作用,因为 <linux/types.h> re-defines 现有类型和编译失败。

另一方面,我不敢自己指定任何数据类型,因为在每个 arch s16 上,所以 fixp_t 可能不同。

如何解决这个问题?

来自 gcc 手册页:

-I dir Add the directory dir to the list of directories to be searched for header files.

因此,要添加您要使用的目录:

-I /usr/src/linux-headers-3.16.0-4-common/include/

但是,我认为用户 space 程序不应该包含内核头文件。如果你的内核模块有一个用户 space API,那么 API 应该在一个与内核头文件分开的头文件中声明,并且只依赖于标准头文件。

根据需要定义您自己的ioctl
将制作特定的 header,以便可以同时包含在应用程序和内核中。
针对内核 headers 编译的内核模块将进行正确的转换。