2016-10-18 7 views
0

Ich habe eine grundlegende Make-Datei zu kompilieren C eine gemeinsame Bibliothek für die Erstellung der notwendigen Dateien, ich habe einen Fehler, da die Make-Datei nicht erkannt wird:Regel nicht im Makefile erkannt?

SOURCES=/home/test/project/sources 
OBJECTS=/home/test/project/objects 

$(OBJECTS)/%.o:$(SOURCES)/%.c 
$(CC) -fPIC -c $^ -o [email protected] 

sharedlib: $(OBJECTS)/%.o 
$(CC) -shared -o libsharedlib.so $< 

Wenn ich laufen lassen ich, dass es keine Regel für das Ziel ist: $(OBJECTS)/%.o benötigt von sharedlib. Während die Regel direkt vor sharedlib geschrieben wird.

+0

Aber Wildcard würde bedeuten, dass ich alle Dateien auf einmal zu kompilieren? – Bionix1441

+0

Ich habe es geändert, aber immer noch das gleiche Problem. – Bionix1441

+0

Versuchen Sie, libsharedlib.so mit allen Objekten gleichzeitig zu kompilieren? – 2501

Antwort

4

Das Hauptproblem ist, dass Sie nirgends sind explizit sagen, was Ihre Quelldateien sind. Beginnen Sie, indem Sie das:

SOURCEDIR=/home/test/project/sources 
SOURCES=$(wildcard $(SOURCEDIR)/*.c) 

Dann die Objektdateinamen aus den Quelldateinamen durch Substitution .c für .o ableiten:

OBJECTDIR=/home/test/project/objects 
OBJECTS=$(patsubst $(SOURCEDIR)/%.c,$(OBJECTDIR)/%.o,$(SOURCES)) 

Sie können immer noch halten Sie Ihre allgemeine Regel zu bauen Objektdateien:

$(OBJECTDIR)/%.o: $(SOURCEDIR)/%.c 
     $(CC) -fPIC -c $^ -o [email protected] 

Aber Sie geben die explizite Liste von Objektdateien von der Regel sharedlib zu machen:

libsharedlib.so: $(OBJECTS) 
     $(CC) -shared -o [email protected] $< 

Beachten Sie, dass ich den Namen der Regel identisch mit der Datei gemacht habe, die generiert wird. Das ist wichtig, denn das zweimalige Aufrufen von make wird dann das Erstellen der Bibliothek ein zweites Mal überspringen. Sie können jederzeit einen Aliasnamen hinzufügen, wenn Sie wollen:

sharedlib: libsharedlib.so 

In diesem Fall ist es auch gut machen zu sagen, dass sharedlib ist keine echte Datei:

.PHONY sharedlib 

Dies verhindert, dass seltsame Dinge passiert, wenn Sie jemals hatte eine Datei namens sharedlib im Verzeichnis.

+0

Ein zusätzliches Problem, und das ist, wenn ich make auf das Ziel '$ (OBJECTDIR) /%. o': Ich bekomme keine Regel, Ziel' $ (OBJECTDIR) /%. o '? Kannst du mir bitte sagen warum? Im Prinzip führt Makefile die Regel '$ (OBJECTDIR) /% .o: $ (SOURCEDIR) /%. c' nicht aus, wenn make auf der Ziel-sharedlib aufgerufen wird. – Bionix1441

+1

@ Bionix1441: weil es keine Regel gibt, die buchstäblich '$ (OBJECTDIR) /%. O' ist. Das ist nur ein * Muster *, und Sie müssen make mit einem echten Dateinamen versehen, der mit dem Muster übereinstimmt, bevor diese Regel verwendet wird. –

+0

Sie haben Recht. endlich kann ich problemlos kompilieren – Bionix1441

1

Die Bibliothek Regel

sharedlib: $(OBJECTS)/%.o 

ist Make zu sagen, nicht genug, die objs für die Bibliothek benötigt werden.

Dies sollte funktionieren, und gibt explizite Kontrolle, auf denen die Quellen/objs Paaren Sie in der Bibliothek wollen:

SOURCESDIR=/home/test/project/sources 
OBJECTDIR=/home/test/project/objects 

OBJLIST = \ 
    $(OBJECTS)/file1.o \ 
    $(OBJECTS)/file2.o 

$(OBJECTDIR)/%.o: $(SOURCESDIR)/%.c 
    $(CC) -fPIC -c $^ -o [email protected] 

sharedlib: $(OBJLIST) 
    $(CC) -shared -o libsharedlib.so $< 
+0

Ich habe gerade festgestellt, dass die Vorschläge zur Bibliotheksregel in der obigen Antwort von G Sliepen sehr passend sind – AdRiX

+0

Danke für die Klarstellung. – Bionix1441

Verwandte Themen