0
我試圖構建一個可加載的內核模塊依賴於幾個源文件,但我得到這個錯誤:Makefile文件找不到LINUX /庫
/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 [email protected]
$(OBJECTS): $(BIN_DIR)/%.o : $(SRC_DIR)/%.c
@$(CC) $(CFLAGS) -c $< -o [email protected]
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)
我的理解它所做的是:
作出的.o文件將
01所有的.c文件列表及相應位置OBJECTS = $(SOURCES:$(SRC_DIR)/%.c=$(BIN_DIR)/%.o)
編譯.c文件創建.o文件
$(OBJECTS): $(BIN_DIR)/%.o : $(SRC_DIR)/%.c @$(CC) $(CFLAGS) -c $< -o [email protected]`
鏈接.o文件讓程序知道在.h文件中定義哪些功能是
$(TARGET): $(OBJECTS) @$(LINKER) $(OBJECTS) $(LFLAGS) -o [email protected]
- 添加.o文件作爲模塊
$(TARGET)-objs := $(OBJECTS)
該命令的對象我使用的是要提出的是
sudo make -j4
你能告訴你正在使用運行make文件中的命令?當你運行它時,你在哪個目錄? –
@ShacharShemesh我已經添加了 – Joel
你知道'linux/spinlock.h'的存在位置嗎? –