RISOLTO Compilare i moduli di un programma in c

Stato
Discussione chiusa ad ulteriori risposte.

Addobbiato

Nuovo Utente
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
2,992
684
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
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
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
Reactions: Mursey

_Achille

Utente Èlite
2,992
684
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
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
Reactions: Addobbiato
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando