2016-12-03 4 views
1

自分のヘッダファイルとそれに対応するソースコードをカーネルモジュールに組み込もうとしています。しかし、いくつかの奇妙な理由のために、私はいつも私のモジュールを作るときに同じエラーが発生します。なぜ誰かが私にこれを解決する方法を説明することができますか?C Makefile - ビルド時にヘッダファイルを追加する方法(Linuxカーネル)

私は、ファイル作成、次いる

:procfsのドライバーのための.koファイルになることになって、次の曲「メインコード」と

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 

#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

それはあなたのヘッダファイルと思われますとメイクファイルは正しいですが、リンカーはその名前が利用できないのでgpioSetMode関数を見つけることができませんあなたのgpioLibモジュールを準備してください。

C言語では、externキーワードは、モジュール内で宣言された関数をそのモジュール外で使用できるようにします。 (キーワードの意味は少し異なります)。

そうのように、gpioSetMode関数宣言にexternキーワードを追加します。@SergeyLebedevで指摘したように

1):

extern void gpioSetMode(unsigned gpio, unsigned mode);

+0

'gpioLib.c'ファイルの* function definition *ではなく、' gpioLib.h'ファイルの* function宣言*に 'extern'キーワードを追加しましたか? – SergeyLebedev

+0

はい(少数の文字) – LandonZeKepitelOfGreytBritn

0

解決策は2つの部分から構成され、私は私の関数を宣言しなければなりませんでしたexternキーワードを使用します。

2)正しい構文は次のとおりですprocdriver-OBJS + = gpioLib.oないprocdriver-OBJ + = gpioLib.o問題を解決していないこと驚いたことに

関連する問題