2012-08-03 17 views
8

Ich muss diese 4 Befehle auf dem Terminal jedes Mal ausführen, wenn ich das Programm mit Bibliotheken ausführen möchte.Makefile für eine Bibliothek

Die Linien sind

cc -m32 -c mylib.c 
ar -rcs libmylib.a mylib.o 
cc -m32 -c prog.c 
cc -m32 prog.o -L. -lmylib 
./a.out 

Wie kann ich ein Makefile für die oben genannten Befehle machen und es laufen? Ein detailliertes Verfahren wäre willkommen. Vielen Dank.


Edit: Hier ist die Lösung:

a.out: prog.o libmylib.a 
     cc prog.o -L. -lmylib 

prog.o: prog.c mylib.h 

libprint_int.a: mylib.o 
     ar -rcs libmylib.a mylib.o 

print_int.o: mylib.c mylib.h 

clean: 
     rm a.out prog.o libmylib.a mylib.o 

Dies gab einen Fehler in Zeile 2, weil ich Leerzeichen Tab anstelle von.

+3

Hier gibt es ein wenig Redundanz. Bei statischen Bibliotheken erhalten Sie dasselbe Ergebnis, wenn Sie die '.o'-Dateien direkt in die Anwendung einbinden, anstatt sie zuerst in eine' .a'-Datei zu stopfen. Eine statische Bibliothek ist schließlich nur ein Haufen zusammengefügter ".o" -Dateien. –

Antwort

7

Etwas wie:

program_NAME := a.out 

SRCS = mylib.c prog.c 

.PHONY: all 

all: $(program_NAME) 

$(program_NAME): $(SRCS) 
    ar -rcs libmylib.a mylib.o 
    cc -m32 prog.o -L. -lmylib 

könnten Sie erhalten begonnen

gerade erst begonnen Makefiles mich mit und ich denke, sie sind ziemlich heikel sind, aber sobald Sie sie erhalten arbeiten sie machen das Leben viel einfacher (dies diejenigen prob voller Bugs, aber einige der erfahrenen mehr sO wird Volk der Lage sein, prob sie zu helfen, zu beheben)

Was ausgeführt wird, stellen Sie sicher, dass Sie die Datei als ‚Makefile‘ speichern (Fall ist wichtig)

dann von der cmd Linie (sicherzustellen, dass Sie mit cd in das Verzeichnis, das Makefile enthält):

$ make 

das ist es!

UPDATE

, wenn die Zwischen statischen Bibliothek ist überflüssig Sie es mit einem Makefile wie folgt überspringen könnten:

program_NAME := a.out 

SRCS = mylib.c prog.c 
OBJS := ${SRCS:.c=.o} 

CFLAGS += -m32 

program_INCLUDE_DIRS := 
program_LIBRARY_DIRS := 
program_LIBRARIES := mylib 

CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir)) 
LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir)) 
LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library)) 

CC=cc 

LINK.c := $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) 

.PHONY: all 

all: $(program_NAME) 

$(program_NAME): $(OBJS) 
    $(LINK.c) $(program_OBJS) -o $(program_NAME) 
+0

Keines der obigen Makefiles funktioniert. –

+0

Es gibt den Fehler Makefile: 25: *** fehlt Trennzeichen. Halt. für die zweite und Makefile: 10: *** fehlt Separator. Halt. für die erste –

+0

Bitte beantworten Sie diese –

0

Ich denke, es gibt keine detailliertere Verfahren als die offizielle Dokumentation des make-Befehl: http://www.gnu.org/software/make/manual/make.html#Overview

Grundsätzlich werden Sie ein Ziel erstellen müssen und nur in sie Ihre Befehle. Das Ziel könnte "alles" sein, wenn Sie möchten, dass es funktioniert, wenn Sie "make" eingeben. Ein gutes Makefile wird sicherlich Variablen verwenden, um es über die lib/sources-Erweiterungen flexibel zu halten.

1

Die einfachste Tutorial zu verstehen, Dateien zu machen ist in Cprogramming.com zur Verfügung. Sobald Sie mit dem Verstehen fertig sind, können Sie das Handbuch make file durchgehen.

+1

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/19056300) – NaN

Verwandte Themen