我正在尝试在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
答案 0 :(得分:1)
您收到错误只是因为您拥有将所有警告视为错误的标志。解决这个问题的一种方法是禁用这样的标志,但我建议作为一种更好的方法在头部和.c中明确声明数组大小[3],这应该使警告消失并且错误用它。
答案 1 :(得分:0)
以下是最终为我工作的内容:
<强> 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[];
驱动程序仍然正常。我希望能帮助遇到同样问题的人。