PDA

Visualizza la versione completa : [C] compilazione complessa...


Ol3iconfini
26-02-2007, 20:43
Salve, ho i seguenti moduli, e non riesco a compilare con gcc:

mat.c (modulo principale) che include cach.c
cach.c che include hello.h, hello.c, vect.h, cach.h
hello.c che include hello.h, common.h, vect.h

Non capisco se devo prima compilare tutti i sorgenti .c e poi collegare in qualche modo i file .o

Qualche suggerimento?
Grazie

oregon
26-02-2007, 20:44
Come mai un .c include un altro .c ?

Ol3iconfini
26-02-2007, 20:46
Perchè l' altro .c esegue altre operazioni complesse.

oregon
26-02-2007, 20:51
Scusa, ma che risposta e'? :)

Un .c non deve includere un altro .c ...

Tutti i .c vengono compilati e trasformati in .obj e questi linkati tra loro e con eventuali librerie per creare un .exe ...

Ol3iconfini
26-02-2007, 21:04
In pratica mat.c prende in ingresso gli argomenti passati da riga di comando e poi lancia una funzione complessa di cach.c.

andbin
26-02-2007, 21:07
Originariamente inviato da Ol3iconfini
Salve, ho i seguenti moduli, e non riesco a compilare con gcc:

mat.c (modulo principale) che include cach.c
cach.c che include hello.h, hello.c, vect.h, cach.h
hello.c che include hello.h, common.h, vect.h No no no.
Non devi includere sorgenti .c. Nei .c ci vanno tutte le variabili/funzioni (insomma ... le implementazioni) che vuoi e negli header .h ci vanno tutte quelle dichiarazioni (costanti, macro, strutture ecc...) che sono indispensabili per usare ciò che hai scritto in un sorgente. Punto.

Per compilare usa:
gcc -c -o modulo.o modulo.c

e per linkare usa:
gcc -o prog modulo1.o modulo2.o ecc....

Più tutti gli eventuali flag per debugging ecc... o eventuali librerie aggiuntive.
Meglio magari se crei un Makefile per automatizzare la fase di build.

oregon
26-02-2007, 21:08
Ma perche' insisti sul termine "complessa"? Intendi nel senso "matematico" (numeri complessi) o perche' la funzione e' complicata? In ogni caso, non importa ...

Ti ripeto, devi compilare tutti i .c e linkare insieme i .obj. Sara' il linker a risolvere le chiamate.

Magari se mostri il codice (o parte del codice) si capisce anche in pratica ...

Ol3iconfini
26-02-2007, 23:45
Provo a fare un po' più di chiarezza...
Dunque, questi sorgenti li ho a disposizione e devo svilupparli ulteriormente.
Per ora mi limitavo ad utilizzare il file mat.o per i miei esperimenti.
Passo come argomenti un file dati e altre opzioni. Ora, dato che devo gestire un file dati di dimensione molto maggiore, mi occorre modificare (suppongo) la dimensione di alcuni vettori all' interno dei sorgenti.
Ecco la necessià di ricompilare il tutto.

Dato questo intreccio di sorgenti tra di loro, mi domandavo quale era l' ordine giusto della compilazione.
Spero di essere stato più chiaro!

Ol3iconfini
27-02-2007, 12:44
Dati i seguenti sorgenti:


mat.c (modulo principale) che include cach.c
cach.c che include hello.h, hello.c, vect.h, cach.h, math.h
hello.c che include hello.h, common.h, vect.h, math.h

ecco i miei passi di compilazione:



gcc -c hello.c -lm
gcc: -lm: linker input file unused because linking not done
gcc -c cach.c -lm
gcc: -lm: linker input file unused because linking not done
gcc -c mat.c

gcc -o prova mat.o cach.o hello.o -lm
hello.o: (.bss+0x0): multiple definition of `min_or_mult'
mat.o: (.bss+0x0): first defined here
.
.
./usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
-
-
mat.c: (.text+0x488): undefined reference to `sqrt'
.
.
collect2: ld returned 1 exit status



Ora capisco che ci sono stati problemi di linking, ma vorrei innanzitutto capire se i passi di compilazione sono corretti...
Grazie.

EDIT:
-------------------


gcc -o prova mat.o cach.o -lm


Cioè senza hello.o, riesco a creare il file prova e funziona se inserisco tra i parametri file dati di 5/6 MB, con uno di 12 MB invece inizia l' esecuzione correttamente e poi fallisce restituendo Segmentation fault (core dumped)

-------------------

andbin
27-02-2007, 12:53
Originariamente inviato da Ol3iconfini
Ora capisco che ci sono stati problemi di linking, ma vorrei innanzitutto capire se i passi di compilazione sono corretti...Se usi -c (che indica: solo compilazione) perché passi -lm che serve per il linker???

Poi comunque l'abbiamo già detto: NON devi includere sorgenti .c!

Dici che in in cach.c includi hello.c. Ma presta attenzione: se in hello.c hai la funzione pippo(), la sua definizione poi si trova sia nel file oggetto hello.o che cach.o. A quel punto il linker ti fa la linguaccia ....

Loading