我正在尝试构建一个依赖于几个源文件的可加载内核模块,但是我收到了这个错误:
/home/.../Uart.h:3:28: fatal error: linux/spinlock.h: No such file or directory
#include <linux/spinlock.h>
^
主模块代码全部在一个文件中(称之为“xdev.c”)。依赖项主要是我需要在模块中调用的函数,并由头文件包含。我的文件组织如下:
./
bin/
This is where I want the compiled dependencies (.o files to go)
src/
My dependencies .c and .h files
...
Uart.h # Error is in this file
Uart.c
Crc8.h
Crc8.c
...
xdev.c # This file include <linux/...> files with no trouble
Makefile
我是使用make文件的新手,但是基于这里的教程和问题,主要是this one,我创建了这个make文件:
TARGET = xdev
LINKER = gcc
# None of the compiler or linker flags I have tried worked, so I removed them
LFLAGS =
CFLAGS =
KERN_DIR = /lib/modules/$(shell uname -r)/build/
MOD_SRC = $(shell pwd)
INC_DIR = $(MOD_SRC)/src
SRC_DIR = $(MOD_SRC)/src
BIN_DIR = $(MOD_SRC)/bin
RM = rm -f
SOURCES = $(wildcard $(SRC_DIR)/*.c)
INCLUDES = $(wildcard $(INC_DIR)/*.h)
OBJECTS = $(SOURCES:$(SRC_DIR)/%.c=$(BIN_DIR)/%.o)
$(TARGET): $(OBJECTS)
@$(LINKER) $(OBJECTS) $(LFLAGS) -o $@
$(OBJECTS): $(BIN_DIR)/%.o : $(SRC_DIR)/%.c
@$(CC) $(CFLAGS) -c $< -o $@
obj-m += $(TARGET).o
$(TARGET)-objs := $(OBJECTS)
all:
+make -C $(KERN_DIR) M=$(MOD_SRC) modules
clean:
+make -C $(KERN_DIR) M=$(MOD_SRC) clean
$(RM) $(OBJECTS)
我对它的作用的理解是:
列出所有.c文件和.o文件的相应位置
OBJECTS = $(SOURCES:$(SRC_DIR)/%.c=$(BIN_DIR)/%.o)
编译.c文件以创建.o文件
$(OBJECTS): $(BIN_DIR)/%.o : $(SRC_DIR)/%.c
@$(CC) $(CFLAGS) -c $< -o $@`
链接到.o文件,以便程序知道.h文件中定义的函数是什么
$(TARGET): $(OBJECTS)
@$(LINKER) $(OBJECTS) $(LFLAGS) -o $@
$(TARGET)-objs := $(OBJECTS)
我正在使用的命令是
sudo make -j4
答案 0 :(得分:0)
尝试告诉编译器在哪里查找头文件:
$(OBJECTS): $(BIN_DIR)/%.o : $(SRC_DIR)/%.c
@$(CC) $(CFLAGS) -I$(INC_DIR) -I<kernel-folder>/include -c $< -o $@