2012-05-22 5 views
0

v4l2의 드라이버 작성에 대해 article을 따라하고 싶었습니다.v4l2 프로그램을 컴파일 할 때 ioport.h 오류

하지만 media/v4l2-dev.h를 포함 시키면 (VFL_TYPE_GRABBER와 같은 일부 매크로에 액세스하려고하므로) 내 첫 번째 기본 시도가 실패했습니다.

In file included from /usr/src/linux/include/linux/device.h:16, 
       from /usr/src/linux/include/media/v4l2-dev.h:14, 
       from driv.c:11: 
/usr/src/linux/include/linux/ioport.h:19: error: expected specifier-qualifier-list   before ‘resource_size_t’ 
/usr/src/linux/include/linux/ioport.h:116: error: expected declaration specifiers or ‘...’ before ‘resource_size_t’ 
/usr/src/linux/include/linux/ioport.h:116: error: expected declaration specifiers or ‘...’ before ‘resource_size_t’ 
/usr/src/linux/include/linux/ioport.h:121: error: expected declaration specifiers or ‘...’ before ‘resource_size_t’ 

[...]

출처 :

미디어/V4L2-dev.h이 출력 충돌 리눅스/ioport.h 포함 리눅스/device.h 포함

gcc -I/usr/src/linux/arch/x86/include -I/usr/src/linux/include -o prog prog.c 
,691 :
#include <asm/types.h> 
#include <linux/videodev2.h> 

#include <media/v4l2-dev.h> 

int main(int argc, char **argv) { 
    return 0; 
} 

나는 컴파일

gcc와 함께 2.6.32-37-generic-pae에서 발생합니다. 4.4.3 glibc 2.10 커널 헤더와 gcc를 비슷한 버전의 gentoo에서 동일하게 시도했습니다.

내가 뭘 잘못하고 있니?

편집 : 정확한 경로를 포함하십시오.

+0

죄송 합니다만, 이것은 평범하게 들릴지 모르겠지만 ... 글자 그대로'gcc -I/path/to/include -o prog prog.c'로 컴파일 했습니까? 아니면'-I' 뒤에 include 경로를 지정 했습니까? –

+0

나는 따옴표에 정확한 경로를 쓰고 싶지 않았다. 나는이 오해를 피하기 위해 앞으로 그것을 할 것이다. 사실, -I는 커널 헤더의 include를 가리 킵니다. – roro

+0

'asm/*. h'는 userspace 프로그램에 직접 포함되지는 않을 것이라고 확신합니다. 그들은 glibc 헤더에 대해'bits/*. h '와 동등한 커널 헤더이며, 다른 헤더 (주로'linux/*. h')에 의해 간접적으로 포함됩니다. 이 API를 cargo-culting하는 것보다는이 API를 사용하는 방법에 대한 설명서를 읽어야합니다. –

답변

0

드라이버 개발을 수행하는 경우 제공된 프레임 워크를 사용하여 드라이버 개발을 수행 할 수도 있습니다. 난 드라이버에 대한 기존 구축 프로젝트를 시작하는 것이 좋습니다 것 (예를 들어 that 일), 보통 메이크 파일이 간단 할 것 같은 :

KERNEL_VERSION := `uname -r` 
KERNEL_DIR := /lib/modules/$(KERNEL_VERSION)/build 

PWD := $(shell pwd) 

obj-m := mymodule.o 

all: mymodule 
mymodule: 
    @echo "Building my driver..." 
    $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules 
install: 
    $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules_install 
    depmod -ae 
clean: 
    rm -f *~ 
    rm -f Module.symvers Module.markers modules.order 
    $(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean 

오히려 경로를 포함하는 두 번째 추측하는 것보다 필요한 것.

더욱이 헤더 파일을 필요로하기 전에 포함해서는 안됩니다.