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
매크로를 게시하십시오. –
@PaulOgilvie이 (가) 편집에 게시되었습니다. http://lxr.free-electrons.com/source/include/linux/module.h#L210 – Splaty
somedriver_cardSpecifc.o가 연결되지 않은 것 같습니다. 링커는 extern []을 볼 수 있지만 구체적인 구현은 볼 수 없다. – pm100