C-Programmierung

Java vs C Modulkonzept Beispiel

Modulkonzept | | CMake

Hauptmodul “main”:

main.c:

#include <stdio.h>
#include "fibo.h"

int main()
{
   int x=fibo(10);
   printf("%d\n", x);

   return(0);
}

Nebenmodul “fibo”:

fibo.h (Prototypen)

int fibo(int n); // <--- the semicolon makes it a prototype

fibo.c (Implementierung)

int fibo(int n) // <--- with the braces we have an implementation
{
   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

Options: