错误:从不兼容的指针类型[-Werror = incompatible-pointer-types]初始化。读取= dev_read,Linux

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误:从不兼容的指针类型[-Werror = incompatible-pointer-types]初始化。读取= dev_read,Linux相关的知识,希望对你有一定的参考价值。

我在Linux的内核代码中遇到以下错误,以进行文件操作。

您能帮我确定这里出了什么问题吗?

代码:

struct GraphData{
 unsigned long addr;
 long time;
};
static int position = 0;
struct GraphData buffer[BUFFER_SIZE]; 


static int dev_open(struct inode *in,struct file *f);
static ssize_t dev_read(struct file *f,struct GraphData *out,size_t count);
static int dev_release(struct inode *inod,struct file *f);

static struct file_operations fops =
{
  .read = dev_read,
  .open = dev_open,
  .release = dev_release
};

static int dev_open(struct inode *in, struct file *f){
 printk(KERN_INFO " Device has been opened 
");
 return 0;
}

static int dev_release(struct inode *in, struct file *f){
  printk(KERN_INFO "Device successfully closed
");
  return 0;
}
static ssize_t dev_read(struct file *f,struct GraphData *out, size_t count)
{
  int ret=0,i=0;

  for(i=0;i<BUFFER_SIZE;i++)
  {
    count = copy_to_user(&out[i],&buffer[i],sizeof(buffer[i]));


    if(count<0)
    {
        printk(KERN_ALERT "Copy!");
        ret = -1;
    }
  }
  return count;
}

内核程序具有文件操作,可以向设备传递缓冲区并将其存储到缓冲区中

用户程序

#define SIZE 500
struct Buffer
{
  unsigned long addr;
  long time;
};
int main()
{
 struct Buffer buf[SIZE];
 int i=0;
 int errorFlag = 0;
 int fp = open("/proc/Probe",O_RDONLY);
 errorFlag = read(fp,buf,1);
    printf("Page Fault Address           Time
");
 for(i=0;i<SIZE;i++)
 {
    //printf("Read worked the Page fault address is 0x%lx caught at time  %ld
",buf[i].address,buf[i].time);
    printf("0x%lx           %ld
",buf[i].addr,buf[i].time);
}
close(fp);
return 0;
}

用户程序打开文件描述符,从设备读取并传递缓冲区以供内核devce复制到。

错误:错误:从不兼容的指针类型[-Werror = incompatible-pointer-types]初始化.read = dev_read,/home/csvb/OS/assign4/hello2.c:36:12:注意:(“ fops.read”的初始化接近)cc1:某些警告被视为错误

答案

您能帮我确定这里出了什么问题吗? [...]错误:错误:从不兼容的指针类型初始化[-Werror = incompatible-pointer-types] .read = dev_read,/home/csvb/OS/assign4/hello2.c:36:12:注意:(对于‘fops.read’)cc1:一些警告被视为错误

诊断对我来说似乎很清楚。在read标识的对象的成员fops的初始化中,将问题定位到文件/home/csvb/OS/assign4/hello2.c的第36行;具体而言,指定初始化.read = dev_read。 “从不兼容的指针类型初始化”的含义恰恰是它所说的:dev_read的类型与fops.read的类型不兼容。默认情况下,这样的问题值得警告,但是编译选项指示它会导致错误。

[一般来说,您应该检查文档或至少标头,以了解要定位的内核版本以确定期望的内容,但是即使不这样做,也可以假定没有参数是安全的。预期具有类型struct GraphData *。那么,那肯定是一种不兼容性。

但是此特定细节在内核5.7的最新预发行版中与在内核2.4中相同。字符设备的读取功能应具有此签名:

ssize_t dev_read_fn(struct file *, char __user *, size_t, loff_t *);

除了第二个参数的类型与您的函数不同之外,它接受的是四个参数,而不是三个。

以上是关于错误:从不兼容的指针类型[-Werror = incompatible-pointer-types]初始化。读取= dev_read,Linux的主要内容,如果未能解决你的问题,请参考以下文章

得到错误而不是不兼容的指针类型警告

指针问题:从不兼容的类型“int”分配给“int *”

c++错误:从不兼容的类型'const char *'分配给'char *'

错误:赋值从没有强制转换的指针生成整数 [-Werror] str1 = (unsigned char*)s1

我收到错误消息,“从不兼容的类型“gameViewController”分配给“id avaudioplayerdelegate””[关闭]

指针类型不兼容??奇怪的