Newsgroup: it.comp.os.linux.development
Titolo: Compilare GCC

Vorrei compilare un semplice file .C tipo il classico HELLO
Faccio GCC hello.c
e poi ? ottengo a.out
Come si fa a creare un piccolo makefile (qualcuno ha un esempio?)
E senza makefile come si genera l'eseguibile ?
Grazie

 ha scritto

gcc hello.c -o hello
             ^ indichi il nome del file 
per informazioni sulla creazione dei make file 
www.gnu.org
 cerca make.
il makefile come nome standard ha:
GNUmakefile
makefile
Makefile
make cerca in questo ordine il file.
Il manuale consiglia di usare Makefile spiegandone i motivi:)
Se lo nomini clarabella devi dare il comando: make -f clarabella
un esempio di makefile potrebbe essere:
start##
# commento
CC = gcc    <- macro
main_prog: pippo.o minnie.o
	$(CC) -o main_prog a.o b.o -llibrerie
pippo.o:	pippo.c pippo.h
	$(CC) -c pippo.c
	       ^ crea il file oggetto *.o senza eseguire il linking
minnie.o:	minnie.c minnie1.h minnie2.h
	$(CC) -c minnie.c 
end###
quelle sopra sono delle regole che esprimono una dipendenza ed un'azione:
target: source
<Tab>   comandi
^^^^è importante la tabulazione, ci deve essere solo questo come primo carattere
    in ogni riga di comandi!!!
target  è il file da produrre
source  sono i prerequisisti ossia i file dai quali dipende target		
comandi elenca i comandi che devono essere eseguiti su "source" se almeno 
	uno dei file specificati è stato modificato
make esegue la prima regola che dice che main_prog dipende dai file
oggetto pippo.o minnie.o i quali dipendono da altri file, come è specificato
nelle regole seguenti.
make controla che esistano i file pippo.o e minnie.o se devono essere aggiornati
perchè hai modificato i file dai quali dipendono li ricompila altrimenti non compie
nessuna azione.
A questo punto si ritorna alla prima regola e make verifica se main_prog è corretto
ossia se la sua data è posteriore a quella dei file dai quali dipende altrimenti
lo creao eseguendo il comando.
Ci sono regole che non hanno bisogno di prerequisiti, una classica è:
clean:
	rm -f *.o
 
in un makefile si possono introdurre abbreviazioni e macro:
$@ il nome del target completo 
$* il nome del target senza suffisso
una macro è del tipo: nome-macro = corpo della macro
quando make esegue il makefile sostituisce <corpo della macro> a <nome-macro>.
Esempio:
start##
DEP = a.o b.o ris.o
ris: $(DEP)
	gcc -o $@ $(DEP)
end###
con le macro puoi definire anche delle opzioni di configurazione:
CFLAGS = -DDEBUG -ggdb
LIBS = elenco librerie
 
-- 
================================================================================
TO REPLY
CHANGE 
NOS...@technologist.com
 IN ingv at 
technologist.com
"...Unix, MS-DOS, and Windows NT (also known as the 
    Good, the Bad, and the Ugly)."                     (by Matt Welsh)

 Grazie
1) leggi il man di gcc
2) scrivi gcc -o hello hello.c 
3) leggi man make 
4) leggi man gcc
5) leggi man make
ciao
-- 
Pazzooo

Grazie "Aitzgorri"
eccezionale supporto, sei grande !

Pape' Satan, pape' Satan aleppe, comincio' M.Lebowski con voce chioccia:
ML> Vorrei compilare un semplice file .C tipo il classico HELLO
ML> Faccio GCC hello.c
ML> e poi ? ottengo a.out
e poi basta, a.out e' il tuo eseguibile :) Se vuoi dargli un altro
nome, usa -o nome_programma
ML> Come si fa a creare un piccolo makefile (qualcuno ha un esempio?)
io di solito uso una cosa simile:
###########################################################################
CC = gcc
CFLAGS = -Wall -O2
LIBS = -lm
EXE = nome_programma
OBJECTS = file1.o file2.o file3.o
###########################################################################
all: dep program
program: $(OBJECTS)
	$(CC) $(CFLAGS) -o $(EXE) $(OBJECTS) $(LIBS)
	strip $(EXE)
clean:                                                                          
	rm -f *.bak *.o *~ *% core
dep:
	@mv -f Makefile Makefile.bak; \
	sed -e '/^# DO NOT DELETE/,$$d' Makefile.bak > Makefile; \
	echo '# DO NOT DELETE THIS LINE - MAKE DEP RELIES ON IT' >> Makefile; \
	echo -e '# dependencies generated by make dep\n' >> Makefile; \
	for f in *.c; do \
		$(CC) -MM `sdl-config --cflags` $$f >> Makefile; \
	done; \
	echo -e '\n# end of generated dependencies' >> Makefile
###########################################################################
# DO NOT DELETE THIS LINE - MAKE DEP RELIES ON IT
-- 
addio, e grazie per tutto il pesce