RISOLTO Compilare i moduli di un programma in c

Stato
Discussione chiusa ad ulteriori risposte.

Addobbiato

Nuovo Utente
4
0
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?
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
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
 

BrutPitt

Utente Attivo
1,166
1,262
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:
  • Mi piace
Reazioni: Mursey

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
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
 
  • Mi piace
Reazioni: Addobbiato
Stato
Discussione chiusa ad ulteriori risposte.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili