2012-04-14 8 views
2

Ich bin beim Schreiben eines Makefiles fest, wenn meine Quellcodedateien über verschiedene Verzeichnisse verteilt sind.Makefile für Quelldateien über verschiedene Verzeichnisse schreiben

Die Verzeichnisstruktur ist wie folgt:

ich meine Quelldateien (.cc) in den Ordnern FOLDER1 und FOLDER2 und die Header-Dateien werden im Ordner mit dem Namen enthalten. Mein Makefile ist in FOLDER1 vorhanden.

 program_NAME := myprogram 
     program_C_SRCS := $(wildcard *.cc) 
     program_C_OBJS := ${program_C_SRCS:.cc=.o} 
     program_OBJS := $(program_C_OBJS) 
     program_INCLUDE_DIRS := ../INCLUDE 
     program_LIBRARY_DIRS := 
     program_LIBRARIES := 
     CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir)) 
     LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir)) 
     LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library)) 

     .PHONY: all clean distclean 

     all: $(program_NAME) 

     $(program_NAME): $(program_OBJS) 
     $(LINK.cc) $(program_OBJS) -o $(program_NAME) 

     clean: 
      @- $(RM) $(program_NAME) 
      @- $(RM) $(program_OBJS) 

     distclean: clean 

hier, wenn ich alle meine Quelle (.cc) -Dateien in FOLDER1 dann funktioniert es aber einige Dateien auf Umzug nach folder2 es Fehler von undefined reference gibt.

Bitte helfen Sie mir zu verstehen, wie Sie meine Makefile ändern, so dass ich alle meine Header-Dateien in einem Verzeichnis sagen kann INCLUDE und meine Quelldateien über verschiedene Verzeichnisse verteilen.

Danke !!!

Antwort

2

Das Problem ist, dass

program_C_SRCS := $(wildcard *.cc) 

fügt nur Quelldateien im selben Verzeichnis. Beim Verknüpfen haben Sie also nicht die Objektdateien Ihres zweiten Ordners.

program_C_SRCS += $(wildcard ../FOLDER2/*.cc) 

directorys

einschließen Ich glaube, Sie verwenden die gcc/g ++, in diesem Fall http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html sagt: Sie können sich wahrscheinlich das Problem, indem einfach die Quelldateien des anderen Ordner auf Ihrem program_C_SRCS lösen Diese Headerpfade werden von links nach rechts durchsucht, dh der zuerst angegebene Pfad wird zuerst gesucht. Daher müssen Sie nur -I INCLUDE2 vor -I INCLUDE1-Option hinzufügen, um zu erreichen, was Sie wollen. Ihr Ausgangs Make-Datei hat bereits eine Transformation für mehr als eine Include-Pfad bauen in:

CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir)) 

Also nur Sie sind Pfade neu zu schreiben:

program_INCLUDE_DIRS := ../INCLUDE2 
program_INCLUDE_DIRS += ../INCLUDE1 
+0

@Haatschii .... Danke !!! Es funktioniert jetzt. –

+0

Ich habe noch einen Zweifel ... Wenn ich 2 Verzeichnisse für Header-Dateien habe sagen INCLUDE1 und INCLUDE2. Wenn die Header-Datei in INCLUDE1 und INCLUDE2 ebenfalls vorhanden ist, sollte sie es von INCLUDE2 abholen und wenn es nicht in INCLUDE2 vorhanden ist, sollte es es von INCLUDE1 selbst abholen. Bitte helfen Sie bei der Änderung der obigen Make-Datei, um diese –

+0

bearbeitet zu erreichen Antwort @KundanKumar – Haatschii

Verwandte Themen