我的makefile文件一:
KVERS = $(shell uname -r)
# Kernel modules
obj-m += second.o
# Specify flags for the module compilation.
#EXTRA_CFLAGS=-g -O0
build: kernel_modules user_test
kernel_modules:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
user_test:
gcc -o second_test second_test.c
clean:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
KVERS = $(shell uname -r)
# Kernel modules
obj-m += second.o
# Specify flags for the module compilation.
#EXTRA_CFLAGS=-g -O0
build: kernel_modules user_test
kernel_modules:
make -C /usr/src/linux-headers-$(KVERS)/ M=$(CURDIR) modules
user_test:
gcc -o second_test second_test.c
clean:
make -C /usr/src/linux-headers-$(KVERS)/ M=$(CURDIR) clean
linux源码树 目录,两种都可编译通过。不知道为什么。。。
一、在ubuntu12.04 内核版本为linux3.5的虚拟机上编译字符驱动程序,出现如下错误:
致命错误: asm/system.h:没有那个文件或目录
头文件错误:
以下是我驱动程序源码的头文件部分:
#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/uaccess.h>
找到linux源码目录 /lib/modules/3.5.0-23-generic-build/arch/arm/include/asm/
打开system.h文件,以下是文件内容:
/* FILE TO BE DELETED. DO NOT ADD STUFF HERE! */
#include <asm/barrier.h>
#include <asm/compiler.h>
#include <asm/cmpxchg.h>
#include <asm/exec.h>
#include <asm/switch_to.h>
#include <asm/system_info.h>
#include <asm/system_misc.h>
第一行说明该文件被删除请不要包含!
可见,linux内核不同版本头文件有些许改变,出现此问题可查看自己版本的头文件。
二、删除system.h再次编译
又出现如下错误:
/home/liushan/drivers/second/second.c: 在函数‘second_init’中:
/home/liushan/drivers/second/second.c:106:3: 错误: 隐式声明函数‘kmalloc’ [-Werror=implicit-function-declaration]
/home/liushan/drivers/second/second.c:106:15: 警告: 赋值时将整数赋给指针,未作类型转换 [默认启用]
/home/liushan/drivers/second/second.c: 在函数‘second_exit’中:
/home/liushan/drivers/second/second.c:127:3: 错误: 隐式声明函数‘kfree’ [-Werror=implicit-function-declaration]
cc1: some warnings being treated as errors
提示错误出现在:kmalloc和kfree函数。
解决:加入#include <linux/slab.h>即可解决。
又是头文件问题,找到linux源码目录 /lib/modules/3.5.0-23-generic-build/include/linux/
打开该文件可以看到一些关于申请内存和释放内存的函数。
再次编译通过。