gpt4 book ai didi

C Makefile - 如何在构建时添加头文件(linux 内核)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:42 25 4
gpt4 key购买 nike

我正在尝试将我自己的头文件及其相应的源代码包含到我的内核模块中。但是由于某些奇怪的原因,我在制作模块时总是遇到同样的错误。有人可以向我解释为什么以及如何解决这个问题吗?

我有以下生成文件:

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);

这是我每次遇到的错误:

pi@raspberrypi:~/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

最佳答案

看来你的头文件和makefile是正确的,但是链接器找不到gpioSetMode函数,因为它的名称在您的 gpioLib 之外不可用模块。

在C语言中是extern使在模块内声明的函数在该模块外可用的关键字。(在 C++ hovewer extern 关键字含义有点不同)。

添加extern gpioSetMode 的关键字函数声明,像这样:

extern void gpioSetMode(unsigned gpio, unsigned mode);

关于C Makefile - 如何在构建时添加头文件(linux 内核)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40952710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com