2017-09-22 3 views
0

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

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? –

+0

@ShacharShemesh J'ai ajouté que – Joel

+0

Savez-vous où 'linux/spinlock.h' existe? –

Répondre

0

Essayez, peut-être, de dire à votre compilateur où chercher les fichiers d'en-tête:

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