当前位置: 技术问答>linux和unix
LDD3中scull的例子
来源: 互联网 发布时间:2016-11-23
本文导语: scull模块我已经编译成功,另外我在网上找了个测试程序想测试一下,但编译的时候老是出问题: In file included from ioctl_test.c:5: scull.h:34: error: field ‘sem’ has incomplete type scull.h:35: error: field ‘cdev’ has incompl...
scull模块我已经编译成功,另外我在网上找了个测试程序想测试一下,但编译的时候老是出问题:
In file included from ioctl_test.c:5:
scull.h:34: error: field ‘sem’ has incomplete type
scull.h:35: error: field ‘cdev’ has incomplete type
源代码:
我网上查了一下,说好像是用户空间和内核空间的问题,但还是没弄明白,希望有人能指点一下。
In file included from ioctl_test.c:5:
scull.h:34: error: field ‘sem’ has incomplete type
scull.h:35: error: field ‘cdev’ has incomplete type
源代码:
#include
#include
#include
#include
#include "scull.h"
int main()
{
int code = 0;
……
exit(0);
}
我网上查了一下,说好像是用户空间和内核空间的问题,但还是没弄明白,希望有人能指点一下。
|
应该是用户空间和内核空间的问题。有些数据类型是内核空间才能够识别的,在用户空间使用时,会报错。
我之前编译一个测试程序时,也出现过这样的问题。
我当时的解决方法很简单,如果测试程序中没有用到内核空间的头文件的话,就把头文件给去了。
如果用到的话,就自己写了一个头文件,只把用到的一些预定义写在里面,然后使用自己写的头文件。
方法比较初级,不过,现阶段能够解决我遇到的问题。
你的测试程序里,如果没有用到scull.h里的东西的话,就去掉吧。。。
我之前编译一个测试程序时,也出现过这样的问题。
我当时的解决方法很简单,如果测试程序中没有用到内核空间的头文件的话,就把头文件给去了。
如果用到的话,就自己写了一个头文件,只把用到的一些预定义写在里面,然后使用自己写的头文件。
方法比较初级,不过,现阶段能够解决我遇到的问题。
你的测试程序里,如果没有用到scull.h里的东西的话,就去掉吧。。。
|
scull.h中所用到的数据结构,如struct cdev,struct semaphore是由内核头文件定义的,也就是只能在内核空间环境下使用。用户应用程序只能使用各种库的头文件(一般是在/usr/include目录下),或自己定义的头文件。
你的两个错误在于,scull.h用在了用户空间的测试程序中,因而找不到struct cdev和struct semaphore的定义(也就是sem和cdev缺少类型)。
解决的办法是你自己定义用户空间的头文件,把要使用的常量(如ioctl各个命令常量),类型包含其中。
你的两个错误在于,scull.h用在了用户空间的测试程序中,因而找不到struct cdev和struct semaphore的定义(也就是sem和cdev缺少类型)。
解决的办法是你自己定义用户空间的头文件,把要使用的常量(如ioctl各个命令常量),类型包含其中。