2012-08-03 12 views
8

Devo eseguire questi 4 comandi sul terminale ogni volta che voglio eseguire il programma utilizzando le librerie.Makefile per una libreria

Le linee sono

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

Come faccio a fare un makefile per i comandi di cui sopra ed eseguirlo? Sarebbe gradita una procedura dettagliata. Grazie.


Edit: ecco la soluzione:

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 

Questo ha dato un errore sulla linea 2 perché ho usato spazi invece di scheda.

+3

C'è una piccola ridondanza qui. Con le librerie statiche, si otterrà lo stesso risultato se si collegano i file '.o' direttamente nell'applicazione, invece di inserirli prima in un file' .a'. Una libreria statica è poco più di un mucchio di file '.o' incollati insieme, dopo tutto. –

risposta

7

Qualcosa di simile:

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 

potrebbe iniziare

solo appena iniziato a utilizzare makefile me stesso e penso che siano abbastanza complicato, ma una volta arrivati ​​li lavorare rendono la vita molto più facile (questa quelli prob pieno di bug, ma alcuni dei più esperti SO popolare sarà prob essere in grado di aiutarli a risolvere)

per quanto riguarda l'esecuzione, assicurarsi di salvare il file come 'Makefile' (caso è importante)

poi dalla linea di cmd (assicurarsi di cd alla Dir contenente il Makefile):

$ make 

questo è tutto!

UPDATE

se la libreria statica intermedia è superfluo si può saltare con un Makefile come questo:

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

Nessuno dei Makefile precedenti funziona. –

+0

Dà l'errore Makefile: 25: *** separatore mancante. Stop. per il secondo e Makefile: 10: *** separatore mancante. Stop. per il primo –

+0

Si prega di rispondere a questo –

0

penso che non esiste una procedura più dettagliata rispetto alla documentazione ufficiale del comando make: http://www.gnu.org/software/make/manual/make.html#Overview

In sostanza si dovrà creare un obiettivo e appena messo i comandi in esso. L'obiettivo potrebbe essere "tutto" se vuoi che funzioni quando digiti "make". Un buon makefile utilizzerà sicuramente variabili ecc. Per mantenerlo flessibile rispetto alle aggiunte di lib/sources.

1

Il tutorial più semplice per capire rendere i file è disponibile in Cprogramming.com. Una volta che lo hai capito, puoi utilizzare il manuale make file.

+1

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/19056300) – NaN

Problemi correlati