Java vs C Modulkonzept Beispiel
← Modulkonzept | ● | CMake →
Hauptmodul “main”:
main.c:
#include "fibo.h"
int main()
{
int x=fibo(10);
printf("%d\n", x);
return(0);
}
Nebenmodul “fibo”:
fibo.h (Prototypen)
fibo.c (Implementierung)
{
if (n<=2) return(1);
else return(fibo(n-1)+fibo(n-2));
}
Hinweise:
- Der Einfachheit halber sind in obigem Header die sog. Guards weggelassen worden.
- Kommandos mit vorangestelltem # sind Befehle des sogenannten C-Präprozessors. Diese bewirken eine textuelle und keine semantische Veränderung des Quelltextes. So bewirkt z.B. #include, das der textuelle Inhalt der inkludierten Datei in den aktuellen Quelltext hineinkopiert wird.
Ãœbersetzung von mehreren Haupt- und Nebenmodulen
Falsch: Direkte Ãœbersetzung der Module:
> gcc main.c Undefined symbols: "_fibo", referenced from: _main in ccxP9xnj.o ld: symbol(s) not found collect2: ld returned 1 exit status
Problem: unaufgelöste Referenz auf die Funktion “fibo”
> gcc fibo.c Undefined symbols: "_main", referenced from: start in crt1.10.6.o ld: symbol(s) not found collect2: ld returned 1 exit status
Problem: unaufgelöste Referenz auf die Funktion “main”
Richtig: Separate Compilation und anschließendes Linken des erzeugten Objectcodes:
> gcc -c fibo.c
erzeugt Objectcode fibo.o
> gcc -c main.c
erzeugt Objectcode main.o
> gcc fibo.o main.o -o main
erzeugt durch Linken des Objectcodes main.o und fibo.o ein ausführbares Programm “main”, wobei unaufgelöste Funktionsreferenzen des einen Moduls durch die Funktionsimplementierung des anderen Moduls aufgelöst werden.
Tipp: Lassen Sie Sich mit nm <module>.o
den Inhalt (d.h. vorhandene Funktionsimplementierungen und Funktionsreferenzen) des jeweiligen Modules ausgeben.
Siehe auch hier unter Kompilation Mit Unix.
← Modulkonzept | ● | CMake →