fragen zu headern und makefiles
-
hi folks!
ich habe in diversen projekten mehrfach gesehen, das die header-daten alle gekapselt waren, etwa so:
#ifndef _FILE_H_ #define _FILE_H_ ... #endif
was bringt das? könnte mir vorstellen das somit die daten nur einmal eingebunden werden. dann müsste ja aber während das compilens/linkens all diese defines etc erhalten bleiben, und auch nur wenn mit makefile kompiliert, oder?. ist das so ?
zweite frage: wie erstelle ich makefiles, die mit mingw kompatibel sind?
gibt es da tools oder wird das alles manuell gemacht? und wenn manuell, woher bekomme ich infos wie?danke schonmal für antworten,
gruss,---loki
-
loki1985 schrieb:
was bringt das? könnte mir vorstellen das somit die daten nur einmal eingebunden werden.
Genauso ist das, nennt sich Include Guards.
loki1985 schrieb:
dann müsste ja aber während das compilens/linkens all diese defines etc erhalten bleiben
Der Linker spielt hier keine Rolle mehr. Beim Kompilieren bleiben die defines solange "erhalten", solange die Übersetzungseinheit (.cpp) kompiliert wird, in der die Header eingebunden wurde.
loki1985 schrieb:
wie erstelle ich makefiles, die mit mingw kompatibel sind?
Dev-C++ macht sowas afair.
-
Makefiles konnen automatisch mit den GNU autotools (automake, autoconf) erstellt werden.
Grob ausgedruckt, erstellst du eine datei, in die du schreibst "programm X besteht aus den Source-Dateien a.c, a.h, b.c" und der erstellt dir dann sozusagen die makefiles.
-
loki1985 schrieb:
#ifndef _FILE_H_ #define _FILE_H_ ... #endif
Das sind die sogenanten Header Guard. Du kannst leider nicht verhindern, dass deine Header File von mehrern Dateien includiert werden und dass die eine oder andere Datei deine Header Datei 2 oder 3 mal includiert. Z.B,
/* common.h */ #include "myhead.h" ... /* main.c */ #include "common.h" #include "myhead.h"
Sollte myhead.h keine Guards benutzen, wirst du 100 Fehler beim Kompilieren bekommen, weil einiege Sahen mehrmals definiert werden und das ist nicht erlaubt. Wenn die Guards dabei sind und die Datei 2 mal eingebunden wird, dann ist _FILE_H_ definiert und bei #ifndef _FILE_H_ wird der Inhalt der Header Datei sozusagen übersprungen, so dass es keine Fehler gibt.
Der Linker kümmert sich darum, die Objekt File (die vom Compiler erstellt werden) zu einer ausführbaren Datei oder Library File zu generieren.
Der Compiler übersetzt den C Code. Nur der Compiler kümmert sich um die #defines. Mit den #ifndef kann man sozusagen Stellen beim Kompilieren rauschneiden und so.Eine Makefile ist eine Datei, die gewisse Regel enthält, um meistens Programme zu kompilieren. Makefile werden aber nicht nur beim kompilieren eingesetzt.
Es gibt ein Programm namens make. Wenn man es ausführt und make findet eine Makefile, dann wird Make anhand dieser Regel die Arbeit erledigen. Unter Windof weiß ich nicht, ob die von Devcpp benutzten Makefile GNU Makefile sind. Wenn schon, dann lies das durch: http://linuxfocus.org/English/November2003/article309.shtml
-
supertux schrieb:
Nur der Compiler kümmert sich um die #defines.
Naja, eigentlich kümmert sich der Präprozessor um #defines.