a2-2 - a2-3
This commit is contained in:
parent
46c99c4309
commit
f063d1c519
|
@ -0,0 +1,19 @@
|
|||
GCC_ARGS = -std=c99 -pedantic-errors -Wall -Wstrict-prototypes
|
||||
|
||||
OBJ = math.o input.o summe.o differenz.o
|
||||
|
||||
math.out : $(OBJ)
|
||||
gcc $(GCC_ARGS) -o $@ $(OBJ)
|
||||
|
||||
%.o : %.c
|
||||
gcc $(GCC_ARGS) -c $<
|
||||
|
||||
math.o : summe.h differenz.h
|
||||
|
||||
summe.o : input.h
|
||||
|
||||
differenz.o : input.h
|
||||
|
||||
|
||||
clean:
|
||||
rm math.out $(OBJ)
|
|
@ -100,3 +100,95 @@ Dieser Fehler entsteht beim **Linken** der Objektcode Dateien.
|
|||
**Begründung:**
|
||||
|
||||
Beim Kompilierungsprozess wird zunächst der Präprozessor ausgeführt. Dieser wird hier keine Fehler zurückgeben, da alle Dateien Problemlos eingebunden werden Können. Die Definitionen innerhalb dieser Dateien sind hier noch nicht wirklich entscheident.
|
||||
|
||||
Anschließend werden die Dateien vom Kompilierer in Objektcode umgewandelt. Auch das sollte problemlos klappen, da die Dateien unabhängig voneinander kompiliert werden, und einzeln keine Fehler aufweisen.
|
||||
|
||||
Dass der Kompilierprozess erfolgreich war, lässt sich feststellen, indem man die `-c` Option mit angibt. Die `.o` Dateien werden alle problemlos erzeugt.
|
||||
|
||||
Nach dem Ausschlussverfahren lässt sich nun feststellen, dass die Fehlermeldung vom Linker erzeugt werden muss.
|
||||
|
||||
Dieses Verhalten ist auch zu erwarten, da erst beim zusammenfügen der Dateien die doppelte Definition der Funktion auffällt.
|
||||
|
||||
Des weiteren lässt sich auch in der Fehlermeldung bereits ablesen, dass der Linker nicht erfolgreich ausgeführt werden konnte.
|
||||
|
||||
```
|
||||
collect2: error: ld returned 1 exit status
|
||||
```
|
||||
|
||||
Hier wird angegeben, dass `ld` einen Fehlercode zurückgegeben hat (exit status nicht 0). Mit dem Befehl `whatis` lässt sich herrausfinden, dass es sich bei `ld` um den GNU linker handelt
|
||||
|
||||
```
|
||||
$ whatis ld
|
||||
ld (1) - The GNU linker
|
||||
```
|
||||
|
||||
## c)
|
||||
|
||||
Damit die Definition der `PROJEKT_NAME` Konstante in jeder Header Datei verfügbar ist, kann man diese z.B. in eine eigene Datei auslagern:
|
||||
|
||||
`projektname.h`
|
||||
```c
|
||||
#define PROJEKT_NAME "Tolles Projekt"
|
||||
```
|
||||
|
||||
diese Datei kann man nun in den anderen Header Dateien includen
|
||||
|
||||
```c
|
||||
#include "projektname.h"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
# A2-3 Ergebnisse
|
||||
|
||||
Die ersten paar Zeilen der Makefile lassen sich "Kochrezept"-artig aus der Vorlesung übernehmen
|
||||
|
||||
```makefile
|
||||
GCC_ARGS = -std=c99 -pedantic-errors -Wall -Wstrict-prototypes
|
||||
|
||||
OBJ = math.o input.o summe.o differenz.o
|
||||
|
||||
math.out : $(OBJ)
|
||||
gcc $(GCC_ARGS) -o $@ $(OBJ)
|
||||
|
||||
%.o : %.c
|
||||
gcc $(GCC_ARGS) -c $<
|
||||
```
|
||||
|
||||
Die `OBJ` Variable enthält die Namen aller benötigten Objektcode Dateien.
|
||||
|
||||
Das Target `math.out` muss ebenfalls angepasst werden. Der Rest ist jedoch allgemein gültig und Funktioniert dank den Pattern rules für viele C Programme.
|
||||
|
||||
Anschließend müssen die Abhängigkeiten angegeben werden. Diese funktionieren ergänzend zu der vorher definierten Pattern rule.
|
||||
|
||||
```makefile
|
||||
math.o : summe.h differenz.h
|
||||
|
||||
summe.o : input.h
|
||||
|
||||
differenz.o : input.h
|
||||
```
|
||||
|
||||
Zuletzt wird noch ein simples `clean` Kommando definiert
|
||||
|
||||
```makefile
|
||||
clean:
|
||||
rm math.out $(OBJ)
|
||||
```
|
||||
|
||||
Nun kann das Programm durch die Eingabe von `make` passend kompiliert werden
|
||||
|
||||
```
|
||||
$ make
|
||||
make
|
||||
gcc -std=c99 -pedantic-errors -Wall -Wstrict-prototypes -c math.c
|
||||
gcc -std=c99 -pedantic-errors -Wall -Wstrict-prototypes -c input.c
|
||||
gcc -std=c99 -pedantic-errors -Wall -Wstrict-prototypes -c summe.c
|
||||
gcc -std=c99 -pedantic-errors -Wall -Wstrict-prototypes -c differenz.c
|
||||
gcc -std=c99 -pedantic-errors -Wall -Wstrict-prototypes -o math.out math.o input.o summe.o differenz.o
|
||||
|
||||
$ ./math.out
|
||||
Ihre Wahl:
|
||||
<S>umme oder <D>ifferenz?
|
||||
```
|
|
@ -1 +1 @@
|
|||
extern int differenz(void);
|
||||
extern int differenz(void);
|
|
@ -1 +1,8 @@
|
|||
int dummy;
|
||||
#include <stdio.h>
|
||||
|
||||
int get_input(char prompt[]) {
|
||||
printf("%s: ", prompt);
|
||||
int in;
|
||||
scanf("%d", &in);
|
||||
return in;
|
||||
}
|
11
a2-1/input.h
11
a2-1/input.h
|
@ -1,10 +1 @@
|
|||
#include <stdio.h>
|
||||
|
||||
extern int get_input(char prompt[]);
|
||||
|
||||
int get_input(char prompt[]) {
|
||||
printf("%s: ", prompt);
|
||||
int in;
|
||||
scanf("%d", &in);
|
||||
return in;
|
||||
}
|
||||
extern int get_input(char prompt[]);
|
|
@ -0,0 +1 @@
|
|||
#define PROJEKT_NAME "Tolles Projekt"
|
Loading…
Reference in New Issue