2012-05-22 2 views
0

Я хотел бы следовать этому article о записи драйвера v4l2.ошибки ioport.h при компиляции программы v4l2

Но моя первая основная попытка не удалась, когда я включил media/v4l2-dev.h (потому что я хочу получить доступ к некоторому макрокоманду, например VFL_TYPE_GRABBER).

медиа/v4l2-dev.h включает в себя Linux/device.h который включает в себя Linux/ioport.h которого происходит сбой с этим выход:

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’ 

[...]

источник:

#include <asm/types.h> 
#include <linux/videodev2.h> 

#include <media/v4l2-dev.h> 

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

Я скомпилирован с:

gcc -I/usr/src/linux/arch/x86/include -I/usr/src/linux/include -o prog prog.c 

Это происходит на 2.6.32-37-generic-pae с gcc 4.4.3 glibc 2.10 Я пробовал то же самое на gentoo с аппроксимативной эквивалентной версией заголовков ядра и gcc.

Что я делаю неправильно?

изменить: указать точный путь.

+0

Извините, это может звучать _really_ покровительствовать ... но вы буквально скомпилировали с помощью 'gcc -I/path/to/include -o prog prog.c' или вы указали путь include после' -I'? –

+0

Я не хотел писать точный путь в цитате, я сделаю это в будущем, чтобы избежать этого промаха. Фактически, я указываю на включение заголовков ядра. – roro

+0

Я уверен, что 'asm/*. H' не предназначены для непосредственного включения в программы пользовательского пространства. Это скорее эквивалент заголовка ядра 'bits/*. H' для заголовков glibc и косвенный косвенный доступ к другим заголовкам (в основном' linux/*. H'). Вы должны прочитать документацию о том, как использовать этот API, а не обрабатывать его ... –

ответ

0

Если вы занимаетесь разработкой драйверов, вы можете использовать предоставленные рамки для этого. я хотел бы предложить, чтобы начать работу с существующим наращиванием проекта для водителя (например, that один), как правило, Makefile так просто, как это будет делать:

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 

, а не пытаться предугадывать, которые включают пути вы необходимость.

Кроме того, вы, вероятно, не должны включать заголовочные файлы, прежде чем они вам понадобятся.

Смежные вопросы