2016-12-03 78 views
1

我想包括我自己的頭文件及其相應的源代碼到我的內核模塊。但是出於某種奇怪的原因,我在製作模塊時總會遇到同樣的錯誤。有人能解釋我爲什麼以及如何解決這個問題嗎?C Makefile - 如何在構建時添加頭文件(linux內核)?

我有以下使文件:

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 

與下面的一段這應該成爲一個procfs的驅動程序.ko文件「主代碼」:

#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

您是否在'gpioLib.h'文件中將'extern'關鍵字添加到*函數聲明*,而不是'gpioLib.c'文件中的*函數定義*中? – SergeyLebedev

+0

是的(幾個字符) – LandonZeKepitelOfGreytBritn

0

該解決方案由兩個部分組成:

1)由@SergeyLebedev指出:我必須聲明我的函數使用extern關鍵字。

2)正確的語法是procdriver-OBJ文件+ = gpioLib.o不procdriver-OBJ + = gpioLib.o