2017-03-18 5 views
0

Hallo Ich habe eine gemeinsame Bibliothek libnsd.so (bestehend aus nsd.c, nsd.h, nd.c, nd.h) mit der Hauptdatei verknüpft. Meine Frage ist, wie man das Makefile schreibt, so dass es nur die Quelldateien neu kompiliert, die geändert wurden. Ich habe einige Themen dazu gelesen, bin aber etwas verwirrt, ich bin ein Anfänger Programmierer. Mein Make-Datei Code so weit:C Makefile - nur geänderte Dateien neu kompilieren

CC=gcc 

all : lib alll 

alll : main.c 
    $(CC) main.c -o main -L. libnsd.so 

lib : nsd.c nsd.h nd.c nd.h 
    $(CC) -c -fPIC nsd.c -o nsd.o 
    $(CC) -c -fPIC nd.c -o nd.o 
    $(CC) -shared -Wl,-soname,libnsd.so -o libnsd.so nsd.o nd.o 

clean: 
    rm main libnsd.so nd.o nsd.o 
+0

Sie müssen das Ziel den gleichen Namen wie die Ausgabedatei haben, die nicht kompiliert werden soll –

+0

(das heißt, haben keine Zielaufrufbefehle, die keine Datei mit dem gleichen Namen wie das Ziel erstellen) –

+1

Sie hätten nsd.o, nd.o, libnsd.so, main als individuelle Ziele –

Antwort

1

Makefiles haben das Konzept der Build-Ziele. Die Build-Ziele sind in Wirklichkeit alle Zwischen- und Enddateien, und durch die Art und Weise, wie sie geschrieben werden, können Abhängigkeiten erzeugt werden.

Eine Probenlösung für Ihr Make-Datei:

CC=gcc 

all: main 

main: main.c libnsd.so 
    $(CC) main.c -o main -L. libnsd.so 

libnsd.so: nsd.o nd.o 
    $(CC) -shared -Wl,-soname,libnsd.so -o libnsd.so [email protected] 

%.o: %.c nsd.h nd.h 
    $(CC) -c -fPIC $< -o [email protected] 

Ein paar Dinge zu beachten:

  1. Sie richtig auf das Objekt Dateierstellung meine Abhängigkeiten korrigieren sollte (da ich der Meinung, dass jeder der C Dateien hängen von den beiden Headern ab).
  2. Vielleicht möchten Sie die Wildcard-Konstruktion, die ich verwendet habe notieren ...
  3. Wenn es etwas Besonderes mit einigen dieser Befehle hätte ich Standard-Befehle arbeiten könnte. Beachten Sie, dass ich $< für die erste Abhängigkeit und [email protected] für die Ausgabe in der Platzhalterregel verwendet habe. Ich habe die clean Regel nicht kopiert, da sie in der Frage selbst korrekt geschrieben wurde.

Jedes der Ziele (neben dem „falschen“ target all) erstellt eine Datei mit dem gleichen Namen: Das Ziel libnsd.so erstellt eine Datei mit dem Namen libnsd.so. Das Ziel main erstellt eine Datei mit dem Namen main.

Da eine Abhängigkeit von einem Datum der Zieländerung so ist, dass die Abhängigkeit neuer als die Ausgabe ist, erstellt make das Ziel sowie andere Ziele, die davon abhängen. Wenn Sie jedoch ein Ziel haben, das keiner Ausgabedatei zugeordnet ist, wird dieses Ziel immer aufgerufen (in unserem Code wird immer das Ziel all aufgerufen, aber zum Glück hat es keine Befehle und es hängt nur von tatsächlichen Dateien ab, die möglicherweise benötigt werden oder nicht neu erstellt werden)

Bitte beachten Sie, dass GNU Make keine Kompilierung benötigt. Die Erstellung einer Ausgabedatei kann durch beliebige bedeutet, und in der Tat habe ich gesehen, ein Ziel ein .cpio.gz Archiv zu erstellen. Wenn das Archiv jedoch älter ist als alle Abhängigkeiten (der Ordner, in den es packen würde), würde es gemäß make neu erstellt werden.

Verwandte Themen