2017-09-22 2 views
0

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 
+0

Können Sie zeigen den Befehl Sie verwenden die Make-Datei ausführen? In welchem ​​Verzeichnis befinden Sie sich, wenn Sie es ausführen? –

+0

@ShaharShemesh Ich habe hinzugefügt, dass – Joel

+0

Wissen Sie, wo 'linux/spinlock.h' existiert? –

Antwort

0

Versuch zu machen, vielleicht, den Compiler zu sagen, wo für die Header-Dateien suchen:

$(OBJECTS): $(BIN_DIR)/%.o : $(SRC_DIR)/%.c 
    @$(CC) $(CFLAGS) -I$(INC_DIR) -I<kernel-folder>/include -c $< -o [email protected]