Cześć,
Mam pewne problemy ze zrozumieniem procesu kompilacji przez gcc . Przypuśćmy, że istnieją następujące pliki (wszystkie w jednym katalogu):
func.h
#ifndef __FUNC_
#define __FUNC_
int add(int a,int b);
int sub(int a, int b);
#endif
func.c
#include "func.h"
int add(int a,int b)
{
return a+b;
}
int sub(int a, int b)
{
return a-b;
}
main.c
#include <stdlib.h>
#include <stdio.h>
#include "func.h"
int main()
{
printf("5+6 = %d\n", add(5,6));
return 0;
}
Jeżeli to skompiluje, to gcc rzuci błędem, że nie może znaleźć 'add'. Jest to logiczne, ponieważ preprocesor wklei mi wszytko z func.h i nie ma tam definicji funkcji.
Czytałem trochę ten wątek na stacku: https://stackoverflow.com/questions/9006704/undefined-reference-to-fill-server-address-collect2-ld-returned-1-exit-status
I z tego co zrozumiałem, to za ten proces odpowiedzialny jest linker.
Przeprowadzając kompilację w taki sposób:
gcc -c func.c # generates the object file func.o
gcc -c main.c # generates the object file main.o
gcc func.o main.o -o main # generates the executable main
Tworzy się plik: func.o - zawiera wyeksportowany adres gdzie jest 'add' i 'sub'
Tworzy się plik: main.o - zawiera miejsce, gdzie powinien znaleźć się adres 'add' i 'sub'
No i linker wkleja wszędzie to co trzeba (dobrze to rozumiem ?)
I teraz moje pytania:
- Jak to możliwe, że nie muszę tworzyć plików obiektowych dla wszystkich plików *.c które zawierają pliki nagłówkowe w takich nawiasach '<....h>' (np. <stdlib.h> ) tylko dzieje się to auto-magicznie ?
- Czy powinno się includować pliki *.c w innych plikach *.c ? Jeżeli podmienię w main 'func.h' na 'func.c' to wszystko będzie ok. Ale czy tak się "robi" ?
- Przypuśćmy, że miałbym wiele własnych plików *.h includowanych (i odpowiednio dla nich plików *.c ) w swoim programie. Czy ja za każdym razem będę musiał tworzyć każdy plik (.o dla każdego pliku *.c i potem to wszystko linkować do maina ? Jak się "normalnie" przeprowadza proces kompilacji dla aplikacji w języku C ?
Z góry dzięki
Pozdr.