RISOLTO Compilare i moduli di un programma in c

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

Addobbiato

Nuovo Utente
Messaggi
4
Reazioni
0
Punteggio
20
Ciao a tutti.
Sto imparando a programmare in C e volevo dividere il mio programma in moduli.
Ho creato un file con il main un file .h e il corrispondente file.c.
C:
/*prova.c

#include <stdio.h>
#include "lib.h"

int main() {
  printf("%d", somma(1,2));
}
C:
/*lib.h

int somma(int, int);
C:
/*lib.c

#include "lib.h"

int somma(int a, int b) {
  return a+b;
}
Ho provato a compilare come segue:
Codice:
gcc -c prova.c
gcc -c lib.c
gcc -o main prova.o lib.o
Ma ottengo il seguente errore:
undefined reference to `somma'.

Come posso utilizzare il mio file .h? DOve sto sbagliando?
Vorrei utilizzare codeblokcs come IDE per effettuare lo stesso processo. Qualcuno sa come posso fare?
 
Gli header devono essere compilati una sola volta, perciò si utilizza un
C:
#ifndef LIB_H
#define LIB_H

//implementazione

#endif
Oppure
C:
#pragma once

//implementazione
 
Ciao.

Premesso che cio' che ha scritto @_Achille e' comunque buona norma osservarlo per evitare ricorsioni di chiamate allo stesso file header... in questo caso pero' non avviene una ricorsione di chiamate all'header (ogni file chiama una sola volta "lib.h"), quindi non e' li' l'errore.

Quell'errore oltretutto e' dovuto al fatto che il compilatore non trova il "corpo" della funzione somma, nonostante sia stata riconosciuta nel main, attraverso il "prototype" contenuto nell'header "lib.h".
In pratica e' come se non vedesse il file lib.c/lib.o o se questi fosse vuoto.

I commenti da te riporrtati "/*" sono errati, o meglio: non sono chiusi (spero che tu non li abbia chiusi sotto, a fine file, soprattutto nel file lib.c: in quel caso si spiegherebbe anche l'errore).
Personalmente non vedevo alcun errore (a parte i commenti errati), per cui ho copiato i files, esattamente come li hai scritti tu, ho soltanto modificanto/chiuso il commento sulla stessa riga (come da codice qui sotto), ricompilati esattamente come fai tu, e non ottengo alcun errore... e il programma funziona: restituisce "3"

C:
/* prova.c */

#include <stdio.h>
#include "lib.h"

int main() {
  printf("%d", somma(1,2));
}


C:
/* lib.h */

int somma(int, int);

C:
/* lib.c */

#include "lib.h"

int somma(int a, int b) {
return a+b;
}

puoi usare anche la notazione diretta:
gcc -o main prova.c lib.c
 
Ultima modifica:
Infatti ho risolto, non so perchè ma adesso funziona, devo aver fatto qualche errore stupido grazie cmq
 
Ciao.

Premesso che cio' che ha scritto @_Achille e' comunque buona norma osservarlo per evitare ricorsioni di chiamate allo stesso file header... in questo caso pero' non avviene una ricorsione di chiamate all'header (ogni file chiama una sola volta "lib.h"), quindi non e' li' l'errore.

Quell'errore oltretutto e' dovuto al fatto che il compilatore non trova il "corpo" della funzione somma, nonostante sia stata riconosciuta nel main, attraverso il "prototype" contenuto nell'header "lib.h".
In pratica e' come se non vedesse il file lib.c/lib.o o se questi fosse vuoto.

I commenti da te riporrtati "/*" sono errati, o meglio: non sono chiusi (spero che tu non li abbia chiusi sotto, a fine file, soprattutto nel file lib.c: in quel caso si spiegherebbe anche l'errore).
Personalmente non vedevo alcun errore (a parte i commenti errati), per cui ho copiato i files, esattamente come li hai scritti tu, ho soltanto modificanto/chiuso il commento sulla stessa riga (come da codice qui sotto), ricompilati esattamente come fai tu, e non ottengo alcun errore... e il programma funziona: restituisce "3"

C:
/* prova.c */

#include <stdio.h>
#include "lib.h"

int main() {
  printf("%d", somma(1,2));
}


C:
/* lib.h */

int somma(int, int);

C:
/* lib.c */

#include "lib.h"

int somma(int a, int b) {
return a+b;
}

puoi usare anche la notazione diretta:
gcc -o main prova.c lib.c
Credo siano comunque commenti aggiunti dopo perché altrimenti il compilatore direbbe che non ha trovato riferimenti a ‘main’.
Infatti ho risolto, non so perchè ma adesso funziona, devo aver fatto qualche errore stupido grazie cmq
Inizia a lavorare con un IDE perché è sì importante sapere come lavorare con un compilatore (cosa che sfortunatamente io ho trascurato) ma questo ti permette di testare il codice velocemente
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top