[C] Makefile: definire correttamente i percorsi

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
FastMagister
Prode Principiante
Messaggi: 44
Iscrizione: venerdì 4 maggio 2007, 11:40

[C] Makefile: definire correttamente i percorsi

Messaggio da FastMagister »

Ciao a tutti,

forse la cosa sembrerà banale a qualcuno, eppure mi sta facendo dannare...

Ho scritto un programmino C che dal file main.c (contenente il main) richiama una funzione contenuta in un altro file .c (il prototipo di tale funzione è invece in un file chiamato lib.h).

Ebbene, se tutti e tre i file sono nella stessa cartella non ho alcun problema nel compilarli, ma se invece sposto il file .c contenente la funzione e l'header file in un'ltra cartella (chiamata INCLUDE) sottocartella della cartella dove si trova main.c mi si incasina tutto...

In sostanza... chi mi fa vedere come scrivere un banale makefile tenendo presente che non tutti i files da compilare si trovano nella stessa cartella? Grazie 1000
7cys7
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 390
Iscrizione: mercoledì 31 gennaio 2007, 12:16

Re: [C] Makefile: definire correttamente i percorsi

Messaggio da 7cys7 »

Mettiamo che main.c si trovi in CARTELLA_PROGRAMMA e in essa ci sia una sottocartella LIBRERIA contenente lib.c e lib.h
Il makefile, contenuto in CARTELLA_PROGRAMMA dovrà essere una cosa del genere:

Codice: Seleziona tutto

# makefile
CC=gcc 
CFLAGS= -O3
all: Main

Main: main.o LIBRERIA/lib.o
	$(CC) $(CFLAGS) main.o LIBRERIA/lib.o -o APP

main.o: main.c LIBRERIA/lib.h
	$(CC) -c $(CFLAGS) main.c -o main.o

lib.o: LIBRERIA/lib.c LIBRERIA/lib.h
	$(CC) -c $(CFLAGS) LIBRERIA/lib.c -o LIBRERIA/lib.o
Inoltre ricordati di inserire i giusti riferimenti nell' include di main.c
Ultima modifica di 7cys7 il venerdì 25 maggio 2007, 5:46, modificato 1 volta in totale.
FastMagister
Prode Principiante
Messaggi: 44
Iscrizione: venerdì 4 maggio 2007, 11:40

Re: [C] Makefile: definire correttamente i percorsi

Messaggio da FastMagister »

Grazie 1000, finalmente è andata!!  (b2b)

Proviamo ad inserire una complicazione ora, e vediamo come cambia il makefile...

il main richiama anche un'altra funzione che si trova in un altro file .c risiedente in una sottocartella di CARTELLA_PROGRAMMA diversa da LIBRERIA ma la cui intestazione sia sempre nell'header file lib.c

Come varierebbe in questo caso il makefile postato prima?

p.s. grazie ancora comunque...
7cys7
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 390
Iscrizione: mercoledì 31 gennaio 2007, 12:16

Re: [C] Makefile: definire correttamente i percorsi

Messaggio da 7cys7 »

Spiegati meglio...
Da quanto ho capito, hai un' altra sottocartella SOTTOCARTELLA_2 contenente il sorgente altro_file.c. Innanzitutto ti conviene creare il file altro_file.h contenente le dichiarazioni delle funzioni definite in altro_file.c per essere pulito. Quindi avrai in SOTTOCARTELLA_2 altro_file.c e altro_file.h.

Il main.c chiama una funzione di altro_file.h

Allora:

Codice: Seleziona tutto

# makefile
CC=gcc 
CFLAGS= -O3
all: Main

Main: main.o LIBRERIA/lib.o SOTTOCARTELLA_2/altro_file.o
	$(CC) $(CFLAGS) main.o LIBRERIA/lib.o SOTTOCARTELLA_2/altro_file.o -o APP

main.o: main.c LIBRERIA/lib.h SOTTOCARTELLA_2/altro_file.h
	$(CC) -c $(CFLAGS) main.c -o main.o

lib.o: LIBRERIA/lib.c LIBRERIA/lib.h
	$(CC) -c $(CFLAGS) LIBRERIA/lib.c -o LIBRERIA/lib.o

altro_file.o: SOTTOCARTELLA_2/altro_file.c SOTTOCARTELLA_2/altro_file.h
        $(CC) -c $(CFLAGS) SOTTOCARTELLA_2/altro_file.c -o SOTTOCARTELLA_2/altro_file.o
Ultima modifica di 7cys7 il venerdì 25 maggio 2007, 5:45, modificato 1 volta in totale.
FastMagister
Prode Principiante
Messaggi: 44
Iscrizione: venerdì 4 maggio 2007, 11:40

Re: [C] Makefile: definire correttamente i percorsi

Messaggio da FastMagister »

Avevi capito bene, anche questo passo è ok ora... GRAZIE (good)  Sto finalmente iniziando a capire come scrivere questi makefile!

Ma... se le cartelle in cui si trovano i file .c diversi dal main non sono sottocartelle della cartella dov'è il main (poniamo ad esempio che CARTELLA_PROGRAMMA e LIBRERIA siano allo stesso livello nel filesystem anzichè essere innestate l'una nell'altra...) come si procederebbe? Devo per forza scrivere il path completo? (ciò sarebbe antipatico perché andando su un pc diverso verosimilmente il tutto non funzionerebbe più con lo stesso makefile...).
7cys7
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 390
Iscrizione: mercoledì 31 gennaio 2007, 12:16

Re: [C] Makefile: definire correttamente i percorsi

Messaggio da 7cys7 »

Non capisco il problema. Le cartelle non sono fisse. Né sono fissi i sorgenti all' interno delle sottocartelle. La cosa più logica è creare una cartella APPLICAZIONE che contenga tutti i sorgenti .c e .h. Se vuoi tenere le sottocartelle (non vedo la praticità), ti comporti come ti ho fatto vedere prima.
Concettualmente tenere allo stesso livello CARTELLA_PROGRAMMA e LIBRERIA è sbagliato. A meno che la libreria non sia generica e utilizzabile da altri programmi.
FastMagister
Prode Principiante
Messaggi: 44
Iscrizione: venerdì 4 maggio 2007, 11:40

Re: [C] Makefile: definire correttamente i percorsi

Messaggio da FastMagister »

Il punto è proprio quello... la libreria deve essere utilizzabile anche da altri programmi...  Come la risolvo??
7cys7
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 390
Iscrizione: mercoledì 31 gennaio 2007, 12:16

Re: [C] Makefile: definire correttamente i percorsi

Messaggio da 7cys7 »

Elementare.
Supponiamo che in home ci siano:
CARTELLA_PROGRAMMA e LIBRERIA.

In CARTELLA_PROGRAMMA ci sia il makefile.

Tutti i riferimenti ai sorgenti di LIBRERIA saranno:

Codice: Seleziona tutto

../LIBRERIA/sorgente.h
8)
FastMagister
Prode Principiante
Messaggi: 44
Iscrizione: venerdì 4 maggio 2007, 11:40

Re: [C] Makefile: definire correttamente i percorsi

Messaggio da FastMagister »

Ottimo, tutto risolto.  (b2b)

In realtà avrei ancora una cosa da chiedere e credo di poterla chiedere qui senza aprire una nuova discussione in quanto ancora inerente ai makefile...

Allora, ho bisogno di compilare dei file .c per ricavarne i relativi .o.

Il mio makefile è il seguente:

Codice: Seleziona tutto

SOURCE = source

UTIL = util

OBJ = file1.o file2.o file3.o file4.o file5.o

OBJ_PATH = $(SOURCE)/file1.o $(SOURCE)/file2.o $(SOURCE)/file3.o $(UTIL)/file4.o $(UTIL)file5.o

main: $(OBJ_PATH) 
	gcc $(OBJ)  -lm -lg2c

.c.o: 
	cc -c -Iinclude -O2 $<

clean:
	rm *.o
Com'è facilmente intuibile, i files da compilare si dividono tra le cartelle "source" ed "util", sottocartelle di CARTELLA_PROGRAMMA dove risiede anche il makefile. Inoltre si rifanno ad un header (.h) risiedente in "include".

Il punto è che nessuno dei files .c contiene un main, quindi non verrà prodotto un eseguibile...Insomma, io voglio solo i files oggetto.

Al momento del lancio del make in effetti ottengo i files .o come desiderato, ma ottengo anche lo sgradevole messaggio:

"/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status"

Come lo elimino? A cosa e dovuto?

Ed ancora... i file .o mi vengono creati nella cartella di lavoro corrente (ovvero CARTELLA_PROGRAMMA). Ma se li volessi in un'altra cartella (poniamo OBJECT...)?

Grazie 1000....
FastMagister
Prode Principiante
Messaggi: 44
Iscrizione: venerdì 4 maggio 2007, 11:40

Re: [C] Makefile: definire correttamente i percorsi

Messaggio da FastMagister »

... nessuno?  :'(
Avatar utente
paper0k
Rampante Reduce
Rampante Reduce
Messaggi: 7220
Iscrizione: lunedì 2 ottobre 2006, 13:39
Contatti:

Re: [C] Makefile: definire correttamente i percorsi

Messaggio da paper0k »

E se togli (o commenti) questa riga che fa?

Codice: Seleziona tutto

main: $(OBJ_PATH) 
	gcc $(OBJ)  -lm -lg2c
;)
Chiunque può essere ragionevole, ma esser sani di mente è raro (Oscar Wilde)
Wiki|Blog|Twitter|Identi.ca|last.fm
FastMagister
Prode Principiante
Messaggi: 44
Iscrizione: venerdì 4 maggio 2007, 11:40

Re: [C] Makefile: definire correttamente i percorsi

Messaggio da FastMagister »

Ehm..    vabbè, sto imparando ora sono giustificato... 

Grazie mille, CIAO  (good)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: Google [Bot] e 2 ospiti