如何在 c 中为 non-kernel 应用程序指定内核 headers 的路径?
How to specify path of kernel headers for non-kernel app in c?
我需要使用 ioctl
将 fixp_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 编译的内核模块将进行正确的转换。
我需要使用 ioctl
将 fixp_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 编译的内核模块将进行正确的转换。