somedriver_cardSpecific.c
に構造体の配列を定義しようとしていますが、somedriver.h
に宣言してからsomedriver.c
で使用してください。しかし、私はsomedriver.c
でコンパイルエラーが表示されます。構造体のグローバル配列をリンクするときのコンパイルエラー
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[];
:ここ
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.c
#include "somedriver.h"
MODULE_DEVICE_TABLE(i2c, somedriver_idtable);
ないのはなぜ私はコンパイルエラーを取得していてください。私はこのリンケージを間違っているのですか?somedriver_idtableの定義には一定のサイズが必要ですか?またはそれはMODULE_DEVICE_TABLE
マクロの制約ですか?
なぜこのLinuxデバイスドライバで私はMODULE_DEVICE_TABLEからi2c_device_idテーブルを分けているのだろうかと思います。後で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
マクロを投稿してください。 –
@PaulOgilvieが編集で掲示されました。 http://lxr.free-electrons.com/source/include/linux/module.h#L210 – Splaty
somedriver_cardSpecifc.oがリンクされていないようです。リンカーはextern []を見ることができますが、具体的な実装はしません – pm100