Je tente de construire un module de noyau chargeable dépend de plusieurs fichiers source, mais je reçois cette erreur:Makefile ne peut pas trouver linux/bibliothèque
/home/.../Uart.h:3:28: fatal error: linux/spinlock.h: No such file or directory
#include <linux/spinlock.h>
^
Le code principal du module est dans un fichier (appelez-le "xdev.c"). Les dépendances sont principalement des fonctions que j'ai besoin d'appeler dans le module et sont incluses dans leurs fichiers d'en-tête. J'ai les fichiers organisés comme ceci:
./
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
Je suis nouveau à l'aide de créer des fichiers, mais basés sur des tutoriels et des questions ici, principalement this one, je créé ce fichier 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)
Ma compréhension de ce qu'il fait est:
faire une liste de tous les fichiers .c et l'emplacement correspondant du fichier .o
OBJECTS = $(SOURCES:$(SRC_DIR)/%.c=$(BIN_DIR)/%.o)
compiler les fichiers .c pour créer les fichiers .o
$(OBJECTS): $(BIN_DIR)/%.o : $(SRC_DIR)/%.c @$(CC) $(CFLAGS) -c $< -o [email protected]`
lien vers les fichiers .o de sorte que le programme sait ce que les fonctions définies dans les fichiers .h sont
$(TARGET): $(OBJECTS) @$(LINKER) $(OBJECTS) $(LFLAGS) -o [email protected]
- ajouter les fichiers .o sous forme d'objets du module
$(TARGET)-objs := $(OBJECTS)
la commande J'utilise pour faire est
sudo make -j4
Pouvez-vous montrer la commande que vous utilisez pour exécuter le fichier make? Dans quel répertoire résidez-vous lorsque vous l'exécutez? –
@ShacharShemesh J'ai ajouté que – Joel
Savez-vous où 'linux/spinlock.h' existe? –