[C] Makefile: definire correttamente i percorsi
-
FastMagister
- Prode Principiante
- Messaggi: 44
- Iscrizione: venerdì 4 maggio 2007, 11:40
[C] Makefile: definire correttamente i percorsi
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
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
Re: [C] Makefile: definire correttamente i percorsi
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:
Inoltre ricordati di inserire i giusti riferimenti nell' include di main.c
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
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
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...
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...
Re: [C] Makefile: definire correttamente i percorsi
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:
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
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...).
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...).
Re: [C] Makefile: definire correttamente i percorsi
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.
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
Il punto è proprio quello... la libreria deve essere utilizzabile anche da altri programmi... Come la risolvo??
Re: [C] Makefile: definire correttamente i percorsi
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:

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-
FastMagister
- Prode Principiante
- Messaggi: 44
- Iscrizione: venerdì 4 maggio 2007, 11:40
Re: [C] Makefile: definire correttamente i percorsi
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:
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....
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
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
... nessuno? :'(
Re: [C] Makefile: definire correttamente i percorsi
E se togli (o commenti) questa riga che fa?

Codice: Seleziona tutto
main: $(OBJ_PATH)
gcc $(OBJ) -lm -lg2c-
FastMagister
- Prode Principiante
- Messaggi: 44
- Iscrizione: venerdì 4 maggio 2007, 11:40
Re: [C] Makefile: definire correttamente i percorsi
Ehm.. vabbè, sto imparando ora sono giustificato...
Grazie mille, CIAO (good)
Grazie mille, CIAO (good)
Chi c’è in linea
Visualizzano questa sezione: Google [Bot] e 2 ospiti

