Newsgroup: it.comp.os.linux.development
Titolo: Makefile non funzionante -> le librerie non vengono condivise

Ciao.
Oggi ho creato il mio primo programma modulare con makefile.
Ho creato primo un piccolo prog con 3 moduli, ed č andato tutto ok.
Ho quindi applicato gli stessi principi ad un programma grosso, mettendo
le librerie e le variabili globali in global.c e suddividendo le funzioni
in vari files.
il mio makefile č piů o meno cosě (l'ho accorciato per semplificare)
----------------------------------------------------
nome_prog: global.o main.o benvenuto.o
	gcc -o nome_prog main.o benvenuto.o -lncurses -lpthread
global.o: global.c
	gcc -c global.c -lncurses -lpthread
main.o: main.c
	gcc -c main.c -lncurses -lpthread
 
benvenuto.o: benvenuto.c
	gcc -c benvenuto.c -lncurses -lpthread
--------------------------------------------
mi vengono fuori errori del tipo
main.c:14: `stdscr' undeclared (first use in this function)
ovvero tutto ciň che č dichiarato in global.c non viene considerato
un'altra cosa: fa differenza la sequenza dei vari *.o: ?
e pure la sequenza dei .o nella prima riga?
Grazie per l'aiuto,
Riccardo

 Ho creato primo un piccolo prog con 3 moduli, ed è andato tutto ok.
Intanto ecco un makefile piu' carino:
###################################
# makefile per compilazione files sorgenti ' C '
#
# programma di prova seriale 
CC = gcc
LD_RUN_PATH = /usr/lib
OBJECT = ${CFILES:.c=.o}
STD= _GNU_SOURCE
CFILES =adconv.c pippo.c pluto.c ecc.c
CFLAGS = -g -Wall -LARGE
LDFLAGS =
TARGETS = adconv
default: $(TARGETS)
.c.o:
        $(CC) $(CFLAGS) -D $(STD) -c $<
$(TARGETS): $(OBJECT)
        $(CC) -o $@ $(OBJECT) -L $(LD_RUN_PATH) $(LDFLAGS)
clean:
        rm -f *.o core
###########################################
Ciao, Nicola.
-- 
______________________________
chi va pian va san e va lontan

Grazie Nicola, il codice che mi hai mostrato mi pare molto più
professionale, senza contare che con l'aumentare dei moduli il tuo è
molto più pratico
L'ho configurato "correttamente" e mi dà lo stesso errore di prima.
Quindi immagino il problema sia nei moduli.O no?
Grazie, Riccardo

Ho ristretto il problema, ed ho cambiato esempio
in pratica non vengono lette le variabili globali
quelli che seguono sono global.c e main.c
----global.c---------
#include <stdio.h>
int numero_glob=6;
---------------------
------main.c--------
int main()
{
 printf("Ecco a voi il numero %d\n",numero_glob);
 return 0;
}
----------------------
questo è il codice di Makefile.
----------------
CC = gcc
LD_RUN_PATH = /usr/lib
OBJECT = ${CFILES:.c=.o}
STD= _GNU_SOURCE
CFILES =global.c main.c
CFLAGS = -g -Wall -LARGE
LDFLAGS = 
TARGETS = prog_modulare
default: $(TARGETS)
.c.o:
	$(CC) $(CFLAGS) -D $(STD) -c $<
$(TARGETS): $(OBJECT)
	$(CC) -o $@ $(OBJECT) -L $(LD_RUN_PATH) $(LDFLAGS)
clean:
	rm -f *.o core`
---------------------------------------------
e quest'ultimo è l'errore che dà
main.c:3: warning: implicit declaration of function `printf'
main.c:3: `numero_glob' undeclared (first use in this function)
main.c:3: (Each undeclared identifier is reported only once
main.c:3: for each function it appears in.)
make: *** [main.o] Error 1
Grazie per l'aiuto.
Mi sbebiterò diffondendo buon software sotto licenza GPL
Ciao,
Riccardo

Ore 3.38.
Sono finalmente riuscito a compilare tutto e a lanciare il mio
eseguibile.
Per risolvere il problema posto nel secondo esempio era sufficiente
dichiarare in un qualsiasi modulo una variabile globale, e per renderla
disponibile agli altri moduli inserire una dichiarazione 
extern nome_var_globale;
Ho poi scoperto che le librerie vanno aggiunte a tutti i moduli(o
quantomeno per talune funzioni era così) e che per evitare di copiarle
duecento volte mi bastava creare una libreria con un 
#ifndef
#define
#endif
contenente le librerie da usare, e darla in pasto ai vari moduli.
inoltre le mutex, se inizializzate staticamente, mi davano un'infinità di
problemi. sembrava venissero dichiarate più volte. Quando ho capito qual
era il problema, le ho dichiarate globalmente e poi inizializzate
manualmente.
E tutto è partito.
'notte,
Riccardo