非常基本的makefile linux

时间:2017-09-19 07:58:22

标签: c linux makefile

我是linux的初学者,并且有关于makefile的问题 我通过互联网搜索过,但它对我没用 我使用的是ubuntu 16.04v,问题是pg.96-99上的问题,编程作业1,操作系统概念第9册。

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

int simple init(void)
{
printk(KERN INFO "Loading Module\n");
return 0;
}

void simple exit(void)
{
printk(KERN INFO "Removing Module\n");
}

module init(simple init);
module exit(simple exit);

MODULE LICENSE("GPL");
MODULE DESCRIPTION("Simple Module");
MODULE AUTHOR("SGG");

这是代码,问题如下。

  

使用附带的Makefile编译此内核模块simple.c   这个项目的源代码。要编译模块,请输入   在命令行上跟随:make

     

编译产生几个文件。文件simple.ko代表   编译内核模块。以下步骤说明了插入此模块   进入Linux内核。

但我不知道如何使用Makefile编译它。 我尝试了很多次但却找不到原因。也许还需要另外一个代码? Plz告诉我。

3 个答案:

答案 0 :(得分:3)

这是非常基本的。如果你有c源,你需要编译。为了编译和链接makefile使用。您可以编写自己的makefile来编译加载模块。那就是说。

这是简单内核加载模块的一般示例,您可以编辑源文件名和路径。

只做vi Makefile。

makefile模板

obj-m = hello.o
KVERSION = $(shell uname -r)
all:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

保存并关闭文件。在此之前不要忘记编辑加载模块名称。

有关上述makefile的信息

  1. Makefile第一行称为目标定义,它定义了要构建的模块hello.o。例如obj-m定义可加载模块目标

  2. $(shell uname -r)是一个有用的调用,用于返回当前的内核构建版本

  3. 然后M=$(PWD)变量赋值告诉make命令实际项目文件存在的位置

  4. 有关Compiling Linux Kernel Modules.

    的详细信息

答案 1 :(得分:2)

这可能对您的Makefile骨架有用:

obj-m += hello-1.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

取自http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html

另外,请务必安装内核头文件

答案 2 :(得分:0)

如果模块所在的路径中有一个名为Makefile的文件,则在命令行中转到该路径运行命令“ make”。这将编译模块代码并创建simple.ko文件。

要将模块加载到内核中,请使用“ insmod”命令(例如:“ insmod simple.ko”)。要了解更多类型,请在命令行中输入“ man insmod”。