英特尔伽利略将内核 header 文件添加到交叉编译工具链

Intel Galileo adding kernel header files to the cross compile toolchain

我在 BSP v1.1 上 yocto 是 1.6

我正在尝试设置交叉编译工具链来编译字符 driver 代码 但我得到的输出是

[mark@localhost ~]$ ${CC} first.c -o 第一个

first.c:1:24: fatal error: linux/init.h: No such file or directory

.#include ^ compilation terminated.

我认为问题在于 header 不在工具链中 /opt/iot-devkit/1.6.1/sysroots/i586-poky-linux/usr/include/linux/~ 这个位置没有

我认为必须添加 IMAGE_INSTALL 或 IMAGE_FEATURE 但我不知道是什么

我走在正确的轨道上吗? 有谁知道我要补充什么? 还是我完全偏离了轨道?

好吧,首先,您 永远不会 通过 运行 ${CC} 在其上构建内核模块。您应该始终使用 Makefile,它将其大部分工作重定向到内核源代码 Makefil。

为您的模块创建一个 Makefile,包含类似于以下内容的内容:

obj-m += hello-1.o

all:
    make -C  $(KERNEL_SRC M=$(PWD) modules

clean:
    make -C  $(KERNEL_SRC) M=$(PWD) clean

示例取自The Linux Kernel Module Programming Guide(注意实际命令需要有制表符缩进)。

然后您必须将 KERNEL_SRC 定义为 /opt/iot-devkit/1.6.1/sysroots/i586-poky-linux/usr/src/kernel/,或者在 Makefile 中,或者从您的 make 调用中。 (使用像 KERNEL_SRC 这样的变量将确保您的模块配方在使用 bitbake 构建时自动选择正确的位置)。

手动构建内核模块:

  1. 为您的 SDK 获取环境-* 文件。
  2. 转到模块目录。
  3. KERNEL_SRC=/opt/iot-devkit/1.6.1/sysroots/i586-poky-linux/usr/src/kernel LDFLAGS="" 制作 但是,这会失败,因为找不到 fixdep。我们将手动修复此问题。
  4. cd /opt/iot-devkit/1.6.1/sysroots/i586-poky-linux/usr/src/kernel
  5. 制作 silentoldconfig 脚本
  6. 返回您的模块目录。
  7. KERNEL_SRC=/opt/iot-devkit/1.6.1/sysroots/i586-poky-linux/usr/src/kernel LDFLAGS="" make

现在应该生成 hello.ko,您应该可以在 Galileo 开发板上进行 insmod。