c - Linux内核模块的Makefile问题

标签 c linux makefile driver kernel-module

我正在编写一个内核模块,它将作为我的中文 Arduino 的驱动程序。

我读过很多关于它的指南,其中的 Makefile 完全不同。其中一些根本不起作用。我想了解如何以及为什么:)

例如,我有一个简单的初学者代码:

    #define MODULE
    #define __KERNEL__

    #include <module.h> // определения для модуля 
    #include <init.h> // module_init и module_exit
    #include <kernel.h> // printk

    MODULE_AUTHOR("...");
    MODULE_DESCRIPTION("Test module for linux kernel");

    int module_start() 
    {
        printk("This is a test module startup message\n");
        return 0;
    }

    void module_stop()
    {
        printk("Module is dead\n");
        return;
    }

    module_init(module_start);
    module_exit(module_stop);

而且我还有一个在手册中找到的 Makefile:

    CC=gcc
    MODFLAGS:= -O2 -Wall -DLINUX
    module.o: module.c
    $(CC) $(MODFLAGS) -c module.c

所以,据我所知,我的系统使用 .ko 文件作为模块。这是第一个问题。第二个是这个 makefile 不起作用。

当我制作时,我收到错误“缺少 module.h”。但我确实安装了 header 。它们位于/usr/src/linux-headers-(3.2.0-4-686-pae) 和 /usr/src/linux-headers-(3.2.0-4-常见)。 *pae目录下没有module.h,但在*common目录下(大部分文件都在那里)。所以,我无法使用 gcc 或 makefile 来编译它。

感谢您的回答。

最佳答案

模块构建的“标准 Makefile”是:

obj-m    := hello-1.o

KDIR    := /lib/modules/$(shell uname -r)/build
PWD    := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
    rm -rf *.o *.ko *.mod.* *.symvers *.order

(从 hello-1.c 创建 hello-1.ko )

唯一使用的 header 是/lib/modules/uname -r 中的 header /构建/包含/。

并且没有“module.h”:请输入 #include <linux/module.h> (或 asm/module.h )。

<小时/>

关于c - Linux内核模块的Makefile问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33312323/

相关文章:

linux - 从另一个文件中的相应条目中减去一个文件中的所有条目,而不考虑缺失值

c++ - 制作文件后启用 cmake 选项/标志

makefile - 如何迭代makefile中变量内的每个文件

c - 在基本井字游戏中保存数据

c - 错误: expected declaration or statement at end of input

linux - 没有浏览器的 Raspberry Pi 上的 WebRTC

c - ip_options_echo 中的 ip 选项时间戳

已经在作业中时的 CreateJobObject 行为

c - allegro5 - 如何在 Linux 上运行?

makefile - GNU Make for 带有两个变量的循环