Phillinger
Member
Hi,
ich beiße mir hier die Zähne an einer Makefile aus, die ich erstellen möchte/muss. Es geht um folgendes:
Es befinden sich C-Quellcodedateien in verschiedenen Verzeichnissen. Es befinden sich selbst erstellte Header-Dateien in verschiedenen Verzeichnissen. Der Code muss mit Präprozessor-Direktiven übersetzt werden, damit gewisse Code-Bereiche beim Compilieren ausgelassen oder überhaupt genutzt werden. Das echte Szenario ist viel zu umfangreich, um es zu erklären, daher eine sehr(!) vereinfachte Version:
/exe_lin/
Hier drin befindet sich das Makefile, hier soll die Binary entstehen.
/prog/
Hier drin ist eine Quellcode-Datei: source.c
Die sieht so aus:
/def/
Hier drin ist eine selbsterstellte Headerdatei: extern.h
Die ist in diesem Beispiel leer, er soll sie einfach finden und inkludieren.
Hier nun die Makefile:
Wenn ich nun make eingebe, zeigt er beim Kompilieren Fehler an, er würde keine main finden (Präprozessor-Direktive fehlt). Entferne ich in diesem Beispiel die #ifdef-Anweisung, meckert er dann, das er keine extern.h finden kann. Die Objekt-Datei ist zu diesem Zeitpunkt schon erstellt, er stolpert also über die Regel von release.
Gebe ich allerdings zuerst "make source.o" und dann "make" ein, funktioniert alles. Wie kann das sein?
Es ist gerade so, als bräuchte er für das Linken (die .o-Datei steht ja schon) nochmal die Präprozessor-Direktiven und die Includepfade. Das kann doch eigentlich nicht sein?
ich beiße mir hier die Zähne an einer Makefile aus, die ich erstellen möchte/muss. Es geht um folgendes:
Es befinden sich C-Quellcodedateien in verschiedenen Verzeichnissen. Es befinden sich selbst erstellte Header-Dateien in verschiedenen Verzeichnissen. Der Code muss mit Präprozessor-Direktiven übersetzt werden, damit gewisse Code-Bereiche beim Compilieren ausgelassen oder überhaupt genutzt werden. Das echte Szenario ist viel zu umfangreich, um es zu erklären, daher eine sehr(!) vereinfachte Version:
/exe_lin/
Hier drin befindet sich das Makefile, hier soll die Binary entstehen.
/prog/
Hier drin ist eine Quellcode-Datei: source.c
Die sieht so aus:
Code:
#ifdef HELLO
#include <stdio.h>
#include <extern.h>
int main(void)
{
printf("Hello, world!\n");
return 0;
}
#endif /* HELLO */
/def/
Hier drin ist eine selbsterstellte Headerdatei: extern.h
Die ist in diesem Beispiel leer, er soll sie einfach finden und inkludieren.
Hier nun die Makefile:
Code:
CC = mxscaleb-gcc
PREPROC = -DHELLO
INCLUDE = -I../def/
release: ../prog/source.o
$(CC) -o hello ../prog/source.o
source.o: ../prog/source.c
$(CC) $(INCLUDE) $(PREPROC) -o ../prog/source.o -c ../prog/source.c
clean:
rm hello ../prog/source.o
Wenn ich nun make eingebe, zeigt er beim Kompilieren Fehler an, er würde keine main finden (Präprozessor-Direktive fehlt). Entferne ich in diesem Beispiel die #ifdef-Anweisung, meckert er dann, das er keine extern.h finden kann. Die Objekt-Datei ist zu diesem Zeitpunkt schon erstellt, er stolpert also über die Regel von release.
Gebe ich allerdings zuerst "make source.o" und dann "make" ein, funktioniert alles. Wie kann das sein?
Es ist gerade so, als bräuchte er für das Linken (die .o-Datei steht ja schon) nochmal die Präprozessor-Direktiven und die Includepfade. Das kann doch eigentlich nicht sein?