0

我在 BSP v1.1 yocto 上是 1.6

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

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

first.c:1:24:致命错误:linux/init.h:没有这样的文件或目录

.#include ^ 编译终止。

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

我认为必须将某些内容添加为 IMAGE_INSTALL 或 IMAGE_FEATURE 但我不知道是什么

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

4

1 回答 1

2

嗯,首先,你永远不能通过运行 ${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(请注意,实际命令需要有一个制表符用于缩进)。

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

要手动构建内核模块:

  1. 为您的 SDK 获取 environment-* 文件。
  2. 转到您的模块目录。
  3. KERNEL_SRC=/opt/iot-devkit/1.6.1/sysroots/i586-poky-linux/usr/src/kernel LDFLAGS="" make 但是这样会失败,因为找不到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 板上安装它。

于 2015-03-26T06:41:44.727 回答