Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C] compilazione complessa...

    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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Come mai un .c include un altro .c ?

  3. #3
    Perchè l' altro .c esegue altre operazioni complesse.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...

  5. #5
    In pratica mat.c prende in ingresso gli argomenti passati da riga di comando e poi lancia una funzione complessa di cach.c.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [C] compilazione complessa...

    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.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...

  8. #8
    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!

  9. #9
    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)

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

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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 ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.