2017-03-01 5 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); 

코드의 관련 비트입니다

#include "somedriver.h" 

MODULE_DEVICE_TABLE(i2c, somedriver_idtable); 

내가 그 컴파일 오류를 받고 있어요 이유는 확실하지 somedriver.c. 이 연결을 잘못하고 있습니까 : 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 테이블 정의와 동일한 파일 내에 포함 시켰습니다. 이안 (Ian)과 파비오 (Fabio)가 언급했듯이, 매크로는 테이블의 크기를 볼 필요가 있고 외형만으로는 볼 수 없습니다. 미래의 코더들이 모든 새 보드에서 크기를 정의 할 필요가 없도록하기를 원했기 때문에 함께 유지하도록 선택했습니다. 여기에 그 모양을 방법은 다음과 같습니다

somedriver_cardSpecific.c

#include <linux/i2c.h> 

extern struct i2c_device_id somedriver_idtable[]; 

드라이버는 여전히 잘 작동

#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.나는 그것이 같은 문제를 겪는 누군가를 돕기를 바랍니다.

+0

오케이. 이상적으로, 그것은'const'라고 선언되어야합니다. –

1

당신은 당신이 모든 경고를 오류로 처리하는 플래그를해서 오류가 있어요. 한 가지 방법은 그런 플래그를 해제하는 것입니다,하지만 헤더와 .c 모두 명시 적으로 배열 크기 [3] 선언하는 더 나은 방법으로 좋습니다 것이 경고를 멀리 이동해야합니다 및 오류 그것으로.

+0

Fabio에게 감사드립니다. 나는 .c와 .h 모두에서 배열 크기를 선언하려고 시도했다. "하나의 요소가 있다고 가정"한 원래 오류를 해결했지만 이제는 differnt 오류가 발생합니다. "오류 : '__mod_i2c__somedriver_idtable_device_table'이 정의되지 않은 기호 'somedriver_idtable'에 앨리어스되었습니다." – Splaty

+0

흠 그냥 깨끗한 빌드를 완료 했으므로 이제는 제대로 컴파일됩니다. 내가 말한 것을 되돌려 놓고 몇 가지 더 시도해 보겠습니다. Fabio에게 감사드립니다. – Splaty