Aufgabe:
Für kleinere Programme mag es noch funktionieren, wenn man alle Funktionen eines C-Programms in eine Source-Datei schreibt. Spätestens aber wenn die Funktionen in mehreren Programmen verwendet werden sollen, ist es besser diese Funktionen in eigene Dateien zu schreiben die bei Bedarf in das Programm eingebunden werden können.
Für diese Funktionalität gibt es in C/C++ die Präprozessoranweisung #include <iostream.h>. Ähnliche Konstrukte gibt es in Pascal (z.B. uses MeineUnit.pas) bzw. Java (z.B. import java.lang.*;)
Das alte Programm hallo.c wird jetzt in die drei Dateien hallo.c, gruss.h und gruss.c aufgeteilt. Zum einfacheren Compilieraufruf werden wir uns einen Makefile erstellen.
Hier könnt Ihr den Source herunterladen (hallowelt.2.tgz 1.078 Byte)
Hier das Beispiel:
/* gruss.h */
#ifndef _gruss_h
#define _gruss_h
void sprung1();
void ausgabe();
void ende();
#endif
/* gruss.c */
#ifndef _gruss_h
#include <gruss.h>
#endif
//------------
void sprung1()
//------------
{
printf("\nHier springen wir zum ersten mal");
}
//------------
void ausgabe()
//------------
{
printf("\nHallo Welt\n");
}
//------------
void ende()
//------------
{
printf("Endsprung\n");
}
/* hallo1.c */
#include <gruss.h>
//----
main()
//----
{
printf("\nWir starten\n");
sprung1();
ausgabe();
ende();
}
Wurde das Programm in der letzten Lektion noch mit
gcc -o hallo1 hallo1.c
kompiliert, so muß diesmal zusätzlich die Datei gruss.c und ein Include-Pfad zur Datei gruss.h angegeben werden:
gcc -o hallo1 -I /home/thomas/c/hallowelt/include gruss.c hallo1.c
bzw.
make -f Makefile1
Wir basteln uns einen Makefile
Da C-Programmierer von Natur aus Faul sind ;-) {siehe nur die teilweise kryptischen Befehle...} werden wir uns jetzt noch eine Datei namens Makefile erstellen. Von jetzt an genügt ein Aufruf von
make
bzw.
make -f Name_der_Makefile_Datei
um unser Programm zu kompilieren.
Standardmäßig sucht make nach einer Datei namens Makefile bzw. makefile.
Anmerkung:
Die Einrückungen im Makefile sind durch zweimaliges drücken der TABULATOR-Taste
einzurücken !
Vergesst nicht in den Makefiles den Pfad
anzupassen!
# Makefile # Makefile fuer das Programm "Hallo Welt" # erstellt von Thomas Gern # am 10.04.1999 #-------Compilereinstellungen COMPILER = gcc LINKER = gcc CFLAGS = -c LFLAGS = #-------Archiviereinstellungen VERSION = 2 TAR = hallowelt #-------Projekteinstellungen COMMAND = hallo1 INCLUDE = -I /home/thomas/c/hallowelt/include SOURCES = gruss.c hallo1.c OBJFILES = $(SOURCES:.c=.o) #-------Befehle zum linken, kompilieren und aufraeumen # linken aller Source-Files .c.o: $(SOURCES) $(COMPILER) $(CFLAGS) $(INCLUDE) -o $@ $< # kompilieren aller Object-Files mit make bzw. make ALL all: $(OBJFILES) $(LINKER) $(LFLAGS) $(OBJFILES) -o $(COMMAND) # loeschen aller erzeugten Object-Files clean: rm $(OBJFILES) # loeschen aller erzeugten Files distclean: clean rm $(COMMAND) # alle erzeugten Files loeschen und die Sources zusammen-zippen tarfile: distclean cd ..; tar cfz $(TAR).$(VERSION).tgz $(TAR)
Der Aufbau und die Befehlsabarbeitung entspricht der letzten Version.
Wir könnten jetzt ein zweites Programm schreiben z.B,
/* hallo2.c */
#include <gruss.h>
//----
main()
//----
{
printf("\nWir starten jetzt voll durch mit Hallo Welt Version 2\n");
sprung1();
ausgabe();
ende();
}
und dieses Programm dann mit:
gcc -o hallo2 -I /home/thomas/c/hallowelt/include gruss.c hallo2.c
bzw.
make -f Makefile2
kompilieren. Hierbei ersparen wir es uns, die Funktionen sprung1(),
ausgabe() und ende() neu einzugeben.
Literatur:
C++
[1] U. Breymann. C++ Eine Einführung. Hanser-Verlag, 1997
[2] B. Stroustrup. The design and evolution of C++. Addison-Wesley,
1994
C
[3] A. Koenig. C Traps and Pitfalls. Addison-Wesley, 1989
[4] B. Kernighan, D. Ritchie. The C Programming Language. Prentice
Hall
Algorithmen
[5] R. Sedgewick. Algorithms. Addison-Wesley, 1988
Makefiles
[6] M. Sylvester, M. Weber, M. Wielsch. LINUX intern. Data Becker,
1998
[7] jeder gut dokumentierte Sourcecode
Nächster Themenbereich:
Globale und lokale VariablenFragen und Anregungen an: Thomas Gern