PDA

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

andbin
13-07-2006, 22:22
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

andbin
14-07-2006, 09:49
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

andbin
14-07-2006, 13:29
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.