调用class_create(),class_device_create()函数编译报错的解决方法

在代码中加入class_create(),class_device_create()函数,编译时华丽丽得报了一大堆错误:

make -C /usr/src/linux-source-4.4.0   M=/home/ubuntu/Documents/first_drv   modules  
make[1]: Entering directory '/usr/src/linux-source-4.4.0'
  CC [M]  /home/ubuntu/Documents/first_drv/firstdrv.o
/home/ubuntu/Documents/first_drv/firstdrv.c: In function ‘first_drv_init’:
/home/ubuntu/Documents/first_drv/firstdrv.c:50:23: error: implicit declaration of function ‘class_device_create’ [-Werror=implicit-function-declaration]
  firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0)
                       ^
/home/ubuntu/Documents/first_drv/firstdrv.c:50:21: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
  firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0)
                     ^
/home/ubuntu/Documents/first_drv/firstdrv.c: In function ‘first_drv_exit’:
/home/ubuntu/Documents/first_drv/firstdrv.c:62:2: error: implicit declaration of function ‘class_device_unregister’ [-Werror=implicit-function-declaration]
  class_device_unregister(firstdrv_class_dev);
  ^
cc1: some warnings being treated as errors
scripts/Makefile.build:264: recipe for target '/home/ubuntu/Documents/first_drv/firstdrv.o' failed
make[2]: *** [/home/ubuntu/Documents/first_drv/firstdrv.o] Error 1
Makefile:1420: recipe for target '_module_/home/ubuntu/Documents/first_drv' failed
make[1]: *** [_module_/home/ubuntu/Documents/first_drv] Error 2
make[1]: Leaving directory '/usr/src/linux-source-4.4.0'
Makefile:19: recipe for target 'all' failed
make: *** [all] Error 2

网上搜索后发现是Linux内核版本不同的原因!早期的版本,使用的是上面说的两个函数,但是在2.6.29以后,使用的函数则变成了 class_create()和device_create(),并且要在声明中加入

#include <linux/device.h> 

因为定义这些函数是在linux4.4.0/include/linux/device.h里面!
在first_drv_init()和first_drv_exit()函数中把class_device_create()、
class_device_unregister()函数修改为device_create()和device_unregister()后,error消失了,但还是有如下warning:

/home/ubuntu/Documents/first_drv/firstdrv.c:50:21: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
  firstdrv_class_dev = device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL
                     ^
/home/ubuntu/Documents/first_drv/firstdrv.c: In function ‘first_drv_exit’:
/home/ubuntu/Documents/first_drv/firstdrv.c:62:20: warning: passing argument 1 of ‘device_unregister’ from incompatible pointer type [-Wincompatible-pointer-types]
  device_unregister(firstdrv_class_dev);
                    ^
In file included from /home/ubuntu/Documents/first_drv/firstdrv.c:6:0:
include/linux/device.h:988:13: note: expected ‘struct device *’ but argument is of type ‘struct class_device *’
 extern void device_unregister(struct device *dev);
             ^
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/ubuntu/Documents/first_drv/firstdrv.mod.o
  LD [M]  /home/ubuntu/Documents/first_drv/firstdrv.ko
make[1]: Leaving directory '/usr/src/linux-source-4.4.0'

原因是

static struct class_device *firstdrv_class_dev;

这个结构体指针变量的声明也要进行修改,改为

static struct device *firstdrv_class_dev;

完成上述修改后,编译ok啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值