我是 Ubuntu 新手,正在尝试编译一个小程序。我在文件夹 raw1394 中有一个 Makefile 和 raw1394.c 文件。
当我运行 make 命令时,它应该生成 raw1394.ko 文件,但是当我运行 make 命令时却没有得到任何内容。
我也尝试用 gcc 编译 raw1394.c 文件但它给出了以下错误。
raw1394.c:1:26: fatal error: linux/module.h: No such file or directory
compilation terminated
你能指导我如何解决这个问题吗?
这是我的 Makefie
obj-m += raw1394.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
这是我的 raw1394.c 文件
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void)
{
printk(KERN_INFO "Loaded dummy raw1394 module\n");
return 0;
}
答案1
源文件名为basic.c
#include <linux/init.h>
#include <linux/module.h>
/*MODULE_LICENSE("Dual BSD/GPL");*/
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
为 ubuntu 制作文件
首先在你的终端上输入,然后uname -r
你将获得在你的系统上使用的版本。
obj-m +=basic.o
KDIR =/usr/src/linux-headers-3.13.0-44-generic
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod.* *.symvers *.order
运行代码
$make
$ sudo insmode basic.ko
$ dmesg
u will get the output
$ sudo rmmod basic.ko
$ dmesg
答案2
很有可能你缺少内核的 Linux 头文件(程序第一行中包含的 .h 文件)。这些文件对于每个内核版本都不同,但都方便地打包在存储库中。尝试按以下方式安装:
sudo apt-get install linux-headers-$(uname -r)
请注意,您的内核版本正在通过uname -r
命令传递。
答案3
GCC 给出错误,因为它找不到您包含的头文件。您应该:
- 检查路径是否不在
raw1394.c
文件夹中,因为然后您需要使用引号代替<>
:所以#include "linux/module.h"
(如果您不想使用自己的内核的头文件,可能会出现这种情况) linux
检查编译器路径中是否有以头文件命名的文件。您可能缺少 Linux 头文件。
其次,makefile 用于自动化编译过程(因为这通常涉及多个指令和/或针对不同目标的不同指令)。但您仍然需要在 makefile 中使用正确的 gcc 命令。因此,您的(基本)makefile 应如下所示(可以向其中添加许多扩展和灵活性,如果您想这样做,请阅读有关 makefile 的更多信息):
CC=gcc
CFLAGS=-Wall -c
raw: raw1394.c
TAB $(CC) $(CFLAGS) raw1394/raw1394.c
all:
clean:
TAB rm -rf raw1394/*.o
请注意,Makefile 中使用了特定意图。因此,我在代码中将 TAB 放在了应该有制表符的位置(多个空格不起作用)。
在命令行中输入make raw
正确的目录将自动执行 Makefile 中的 target raw。