View Full Version : [c]:makefile
mercury841
13-07-2006, 19:03
Ragazzi ma come si fa un makefile?
io ho fatto in questo modo è corretto?
#!/bin/sh
echo compilo prima gli header
cc -c sorgenti/gestione_connessione/libnet.c
cc -c sorgenti/gestione_connessione/liste.c
cc -c sorgenti/gestione_connessione/liste_t.c
echo compilo client.c e server.c
cc -o server sorgenti/server.c libnet.o liste.o liste_t.o stringhe.o -lpthread
cc -o client sorgenti/client.c libnet.o liste.o liste_t.o stringhe.o -lpthread
ciao e grazie per l'attenzione
Ragazzi ma come si fa un makefile?Quello che hai scritto è un semplice "batch" di compilazione. Ovviamente è molto inefficiente, (ri)compila sempre tutto!
Nota solo che non hai indicato come compili stringhe.o.
Un possibile makefile è questo:
COMP=cc
LINK=cc
CFLAGS=
LFLAGS=
LIBS=
$OBJS_SERVER=server.o libnet.o liste.o liste_t.o stringhe.o
$OBJS_CLIENT=client.o libnet.o liste.o liste_t.o stringhe.o
server: $(OBJS_SERVER)
@echo "Linking $@ ..."
@$(LINK) $(LFLAGS) $(LIBS) -o $@ $(OBJS_SERVER)
client: $(OBJS_CLIENT)
@echo "Linking $@ ..."
@$(LINK) $(LFLAGS) $(LIBS) -o $@ $(OBJS_CLIENT)
%.o: %.c
@echo "Compiling $< ..."
@$(COMP) $(CFLAGS) -c -o $@ $<
#-- dipendenze --
libnet.o: sorgenti/gestione_connessione/libnet.c
liste.o: sorgenti/gestione_connessione/liste.c
liste_t.o: sorgenti/gestione_connessione/liste_t.c
server.o: sorgenti/server.c
client.o: sorgenti/client.cOvviamente non l'ho provato. Metti la dipendenza per stringhe.o.
mercury841
14-07-2006, 09:28
si grazie per l'aiuto, però così non ci ho capito molto :) ,
non è che conosci qualche guida da dove poter apprendere come fare un makefile da solo?
ma la libreria lpthread non bisogna metterla nel makefile???
ciao, grazie per la pazienza
si grazie per l'aiuto, però così non ci ho capito molto :) ,
non è che conosci qualche guida da dove poter apprendere come fare un makefile da solo?Il manuale ufficiale del make lo trovi <qui> (http://www.gnu.org/software/make/manual/).
ma la libreria lpthread non bisogna metterla nel makefile???Sì .... ho dimenticato di metterlo ... :p
Ti faccio un esempio più semplice. Ammesso di avere 1 solo sorgente chiamato prova.c, per generare l'eseguibile 'prova' si può fare questo makefile:
prova: prova.o
cc -o prova prova.o
prova.o: prova.c
cc -c -o prova.o prova.cIl make lavora con dei target/dipendenze: in pratica in questo caso, prova.o dipende da prova.c. prova (l'eseguibile) a sua volta dipende da prova.o. Il make legge queste direttive, verifica lo stato delle dipendenze ed esegue solo i comandi che servono.
mercury841
14-07-2006, 10:21
ho fatto in questo modo:
server: server.o libnet.o liste.o liste_t.o
cc -o server server.o libnet.o liste.o liste_t.o -lpthread
client: client.o libnet.o liste.o liste_t.o
cc -o client client.o libnet.o liste.o liste_t.o -lpthread
sever.o: sorgenti/server.c
cc -c sorgenti/server.c
libnet.o: sorgenti/gestione_connessione/libnet.c
cc -c sorgenti/gestione_connessione/libnet.c
liste.o: sorgenti/gestione_connessione/liste.c
cc -c sorgenti/gestione_connessione/liste.c
liste_t.o: sorgenti/gestione_connessione/liste_t.c
cc -c sorgenti/gestione_connessione/liste_t.c
però mi se faccio il make mi da questo errore:
makefile:1: *** commands commence before first target. Stop.
che vuol dire???????
mercury841
14-07-2006, 10:25
ho risolto erano i TAB, grazie per l'aiuto ciao
ho risolto erano i TAB, grazie per l'aiuto ciaoSì, infatti. Questa è una fesseria dei makefile .... Le righe di comando devono avere un TAB davanti.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.