链接全局结构数组时的编译错误

时间:2017-03-01 16:29:34

标签: c linux-device-driver

我正在尝试在somedriver_cardSpecific.c中定义一个结构数组,在somedriver.h中声明它,然后在somedriver.c中使用它。但是我在somedriver.c中遇到了编译错误:

error: array '__mod_i2c__somedriver_idtable_device_table' assumed to have one element [-Werror]
 extern const typeof(name) __mod_##type##__##name##_device_table

in expansion of macro 'MODULE_DEVICE_TABLE'
 MODULE_DEVICE_TABLE(i2c, somedriver_idtable);

以下是相关的代码:

somedriver_cardSpecific.c

#include <linux/i2c.h>

#include "somedriver.h"

struct i2c_device_id somedriver_idtable[] = {
    { "somedevice_1",   0 },
    { "somedevice_2",   1 },
    { },
};

somedriver.h

#include <linux/i2c.h>

extern struct i2c_device_id somedriver_idtable[];

somedriver.c

#include "somedriver.h"

MODULE_DEVICE_TABLE(i2c, somedriver_idtable);

不确定我为什么会收到编译错误。我是否错误地执行此链接:somedriver_idtable的定义是否需要一定的大小?或者它是MODULE_DEVICE_TABLE宏的约束?

如果您想知道为什么在这个Linux设备驱动程序中我将i2c_device_id表与MODULE_DEVICE_TABLE分开:我正在尝试对代码进行重新分解,以便后来具有不同数量的i2c设备的主板可以创建自己的somedriver_cardSpecific.c文件并编译/链接。

感谢您的帮助。

修改 宏在Linux内核中定义:linux / module.h。 http://lxr.free-electrons.com/source/include/linux/module.h#L212

210 #ifdef MODULE
211 /* Creates an alias so file2alias.c can find device table. */
212 #define MODULE_DEVICE_TABLE(type, name)                                 \
213 extern const typeof(name) __mod_##type##__##name##_device_table         \
214   __attribute__ ((unused, alias(__stringify(name))))
215 #else  /* !MODULE */
216 #define MODULE_DEVICE_TABLE(type, name)
217 #endif

2 个答案:

答案 0 :(得分:1)

您收到错误只是因为您拥有将所有警告视为错误的标志。解决这个问题的一种方法是禁用这样的标志,但我建议作为一种更好的方法在头部和.c中明确声明数组大小[3],这应该使警告消失并且错误用它。

答案 1 :(得分:0)

以下是最终为我工作的内容:

  1. 我清理了构建目录。在旧版本的基础上构建导致这些文件失败,不确定原因。
  2. 正如@IanAbbott所提到的,我将MODULE_DEVICE_TABLE()宏移动到与i2c_device_id表定义相同的文件中。正如伊恩和法比奥所说,宏需要看到表的大小,并且只能看到extern。我不希望将来的编码人员需要为每个新板定义尺寸,所以我选择将它们保持在一起。以下是它的外观:
  3. <强> somedriver_cardSpecific.c

    #include <linux/module.h>    
    #include <linux/i2c.h>
    #include "somedriver.h"
    
    struct i2c_device_id somedriver_idtable[] = {
        { "somedevice_1",   0 },
        { "somedevice_2",   1 },
        { },
    };
    MODULE_DEVICE_TABLE(i2c, somedriver_idtable);
    

    <强> somedriver.h

    #include <linux/i2c.h>
    
    extern struct i2c_device_id somedriver_idtable[];
    

    驱动程序仍然正常。我希望能帮助遇到同样问题的人。