2017-03-01 1 views
1

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 
+0

マクロを投稿してください。 –

+0

@PaulOgilvieが編集で掲示されました。 http://lxr.free-electrons.com/source/include/linux/module.h#L210 – Splaty

+0

somedriver_cardSpecifc.oがリンクされていないようです。リンカーはextern []を見ることができますが、具体的な実装はしません – pm100

答えて

0

は私のために働くことになったものです:

  1. 私はビルドディレクトリを掃除しました。古いビルドの上にビルドすると、これらのファイルで失敗が発生しました。理由は不明です。
  2. 前述の@IanAbbottと同様に、MODULE_DEVICE_TABLE()マクロをi2c_device_idテーブル定義と同じファイル内に移動しました。イアンとファビオが述べたように、マクロはテーブルの大きさを見る必要があり、外出先で見ることはできません。私は将来のコーダーが新しいボードごとにサイズを定義する必要があることを望んでいなかったので、それらを一緒に保つことを選択しました。ここではそれがどのように見えるかです:

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[]; 

ドライバがまだ正常に動作します。同じ問題を抱えている人に役立つことを願っています。

+0

理想的には、それは 'const'と宣言されるべきです。 –

1

はあなたが上のすべての警告をエラーとして扱うためのフラグを持っているという理由だけで、エラーを取得しています。これを解決する1つの方法は、このようなフラグを無効にすることですが、ヘッダーと.cの両方で配列サイズ[3]を明示的に宣言する方が良い方法として推奨します。これにより、警告が消え、エラーそれと。ここで

+0

Fabioに感謝します。私は.cと.hの両方で配列サイズを宣言しようとしました。これは、元のエラー "1つの要素を持つと仮定"を解決するが、異なるエラーが発生する: "エラー: '__mod_i2c__somedriver_idtable_device_table'は未定義のシンボル 'somedriver_idtable'にエイリアスされた" – Splaty

+0

ちょうどきれいなビルドを行いました。私が言ったことを取り返し、もう少し試してみる。 Fabioに感謝します。 – Splaty