Ultima modifica:
Vabbé, ma vale la pena capire come funziona questo meccanismo visto che è anche abbastanza didattico.Penso che il tuo modo di organizzare i file sia piu' comodo per includere i file, anche perche' cosi' non mi da errori.
Se vuoi ottenere questo
Codice:
.
├── bin
│ └── main
├── include
│ └── test.h
└── src
├── main.c
└── test.c
Puoi fare questa cosa qui
C:
// main.c
#include <stdio.h>
#include "../include/test.h"
int main() {
int x = sum(6, 6);
printf("%d\n", x);
return 0;
}
// test.h
#ifndef TEST_H_
#define TEST_H_
int sum(int, int);
#endif // TEST_H_
// test.c
#include "../include/test.h"
int sum(int x, int y) {
return x + y;
}
gcc -o bin/main src/test.c src/main.c
. In alternativa, puoi fare questa cosa qui
C:
// main.c
#include <stdio.h>
#include <test.h>
int main() {
int x = sum(6, 6);
printf("%d\n", x);
return 0;
}
// test.h
#ifndef TEST_H_
#define TEST_H_
int sum(int, int);
#endif // TEST_H_
// test.c
#include <test.h>
int sum(int x, int y) {
return x + y;
}
gcc -I./include -o bin/main src/test.c src/main.c
.In caso hai tanti files .c, può essere conveniente compilarli separatamente (in object files) e unirli in un unico eseguibile usando il linker. Il vantaggio è che se modifichi un solo file non devi ricompilare l'intero progetto. In questo caso la differenza è impercettibile perché un progetto di prova impiega pochi millisecondi a compilarsi, ma su roba più sostanziosa la differenza si sente. In questo caso devi compilare in questo modo
Codice:
gcc -I./include -c src/test.c -o obj/test.o
gcc -I./include -c src/main.c -o obj/main.o
gcc obj/main.o obj/test.o -o bin/main
Volendo si possono generare anche tutti i file intermedi (e.g., i file assembly) e utilizzare strumenti diversi (e.g., ld) per capire meglio cosa fa il compilatore, cosa fa l'assemblatore e cosa fa il linker. GCC incorpora anche quelle funzionalità, quindi non c'è bisogno di usarli direttamente, ma può aiutare a capire il funzionamento di un compilatore. A quel punto, se ottieni un errore del tipo undefined reference to `sum' hai un'idea migliore su cosa sta accadendo: il problema è nella fase di linking e non nella fase di compilazione.