2016-12-03 3 views
1

Я пытаюсь включить мой собственный заголовочный файл и его соответствующий исходный код в мой модуль ядра. Но по какой-то странной причине я всегда получаю ту же ошибку при создании моего модуля. Может ли кто-нибудь объяснить мне, почему и как я могу это исправить?C Makefile - Как добавить файлы заголовков при создании (linux kernel)?

У меня есть следующие сделать файл:

TARGET = procdriver 

obj-m := procdriver.o 
procdriver-obj+= gpioLib.o 

KDIR:= /home/pi/myRpi/linux 
PWD := $(shell pwd) 

all: gpioLib.o procdriver.c 
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 
    rm -r -f .tmp_versions *.mod.c .*.cmd *.o *.symvers 

gpioLib.o: gpioLib.c gpioLib.h 
    gcc -c gpioLib.c -o gpioLib.o 

clean: 
    make -C $(KDIR) SUBDIRS=$(PWD) clean 

со следующей частью «основной код», который, как предполагается, станет .ko файл для драйвера Procfs:

#include <linux/module.h> 
    #include <linux/proc_fs.h> 
    #include <linux/seq_file.h> 

    #include "gpioLib.h" 




    static int __init hello_proc_init(void) { 
     int i; 

     //initialize GPIO 
     procFileStr = proc_create("procdriver", 0, NULL, &hello_proc_fops); 
     printk(KERN_DEBUG MODULE_NAME "init procdriver!\n"); 
     for (i=0; i<43; i++) 
     { 
      gpioSetMode(i, PI_OUTPUT); ////THIS IS THE PROBLEM 
     } 

     return 0; 
    } 

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

gpioLib.c

#include "gpioLib.h" 

void gpioSetMode(unsigned gpio, unsigned mode) 
{ 
    int reg, shift; 

    reg = gpio/10; 
    shift = (gpio%10) * 3; 

    gpioReg[reg] = (gpioReg[reg] & ~(7<<shift)) | (mode<<shift); 
} 

и соответствующий gpioLib.h

#define PI_ALT3 7 

#define PI_ALT4 3 

#define PI_ALT5 2 

void gpioSetMode(unsigned gpio, unsigned mode); 

Это ошибка я получаю каждый раз:

[email protected]:~/myRpi $ make 
gcc -c gpioLib.c -o gpioLib.o 

make -C /home/pi/myRpi/linux SUBDIRS=/home/pi/myRpi modules 
make[1]: Entering directory '/home/pi/myRpi/linux' 
    CC [M] /home/pi/myRpi/procdriver.o 
    Building modules, stage 2. 
    MODPOST 1 modules 
WARNING: "gpioSetMode" [/home/pi/myRpi/procdriver.ko] undefined! 
    CC  /home/pi/myRpi/procdriver.mod.o 
    LD [M] /home/pi/myRpi/procdriver.ko 
make[1]: Leaving directory '/home/pi/myRpi/linux' 
rm -r -f .tmp_versions *.mod.c .*.cmd *.o *.symvers 

ответ

1

Это кажется, что ваши файлы заголовков и makefile верны, но компоновщик не может найти функцию gpioSetMode, потому что ее имя недоступно ou подключите ваш модуль gpioLib.

В языке C это ключевое слово extern, которое делает функцию, объявленную внутри модуля доступной вне этого модуля. (В C++ hovewer extern значение ключевого слова немного отличается).

Добавить extern ключевое слово для gpioSetMode объявление функции, например, так:

extern void gpioSetMode(unsigned gpio, unsigned mode);

+0

Удивительно, что не решить проблему! – LandonZeKepitelOfGreytBritn

+0

Вы добавили ключевое слово 'extern' в * описание функции * в файл' gpioLib.h', а не в * определение функции * в файле 'gpioLib.c'? – SergeyLebedev

+0

Да (несколько символов mor) – LandonZeKepitelOfGreytBritn

0

Решение состояло из двух частей:

1) как указал @SergeyLebedev: Я должен был объявить свою функцию используя ключевое слово extern.

2) правильный синтаксис procdriver-OBJS + = gpioLib.o не procdriver-OBJ + = gpioLib.o

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