Ошибки ioport.h при компиляции программы v4l2

Я хотел следовать этой статье о написании драйверов v4l2.

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

media / 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.

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

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

1 ответ

Если вы занимаетесь разработкой драйверов, вы также можете использовать для этого предоставленные фреймворки. я бы предложил начать с существующего проекта сборки для драйвера (например , того), обычно 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

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

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

Другие вопросы по тегам