Ich versuche, findet einen ladbaren Kernel-Modul abhängig von mehreren Quelldateien zu erstellen, aber ich diesen Fehler:Makefile kann nicht linux/Bibliothek
/home/.../Uart.h:3:28: fatal error: linux/spinlock.h: No such file or directory
#include <linux/spinlock.h>
^
Der Hauptcodemodul ist alles, was man in Datei (nennen Sie es "xdev.c"). Die Abhängigkeiten sind meist Funktionen, die ich im Modul aufrufen muss und die in ihren Header-Dateien enthalten sind. Ich habe die folgende Art Dateien wie:
./
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
Ich bin neu in Dateien zu verwenden, sondern basiert auf Übungen und Fragen hier in erster Linie this one, habe ich diese Make-Datei:
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)
Mein Verständnis von dem, was sie tut, ist:
eine Liste aller .c-Dateien machen und die entsprechende Position für die .o-Datei
OBJECTS = $(SOURCES:$(SRC_DIR)/%.c=$(BIN_DIR)/%.o)
die .c-Dateien zusammenstellen, die .o Dateien
$(OBJECTS): $(BIN_DIR)/%.o : $(SRC_DIR)/%.c @$(CC) $(CFLAGS) -c $< -o [email protected]`
Link zu den .o-Dateien zu erstellen, damit das Programm weiß, was die definierten Funktionen in den H-Dateien sind
$(TARGET): $(OBJECTS) @$(LINKER) $(OBJECTS) $(LFLAGS) -o [email protected]
- fügen Sie die .o-Dateien als Objekte des Moduls
$(TARGET)-objs := $(OBJECTS)
der Befehl Ich verwende ist
sudo make -j4
Können Sie zeigen den Befehl Sie verwenden die Make-Datei ausführen? In welchem Verzeichnis befinden Sie sich, wenn Sie es ausführen? –
@ShaharShemesh Ich habe hinzugefügt, dass – Joel
Wissen Sie, wo 'linux/spinlock.h' existiert? –