Hallo,
ich schreibe mir momentan eine Klasse für den UART, um sie später
einfacher in neue Projekte einbinden zu können. Als Entwicklungsumgebung
verwende ich Atmel Studio 6. Der Compiler hat folgende Version:
"AVR8/GNU C++ Compiler : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2"
Ich habe nun in einem Projekt eine Header-Datei (Uart.h) mit der
Klassendefinition und den Prototypen der Methoden erstellt, diese
inkludiere ich in meinem Projekt. Die Methoden selbst befinden sich in
einer cpp-Datei (Uart.cpp), welche ebenfalls die Header-Datei
inkludiert. Alle anderen benötigten "includes" sind in der Header-Datei
untergebracht.
Wenn ich nun in meiner Hauptdatei (nennen wir sie mal main.cpp) den Wert
für die Konstante F_CPU definiere und den Header von meiner Klasse
inkludiere, bekomme ich die im Betreff enthaltene Fehlermeldung. Macht
für mich auch eigentlich Sinn, da so wie ich das verstanden habe, die
Datei einfach nur mit kompiliert wird damit der Linker diese Methoden
den passenden Prototypen aus der Header-Datei zuweisen kann. Diese Datei
sieht also nicht das #define in meiner main.cpp sondern nur alles was in
meiner Uart.h steht.
Wenn ich nun also F_CPU in Uart.h definiere funktioniert es, wie zu
erwarten war. Allerdings müsste ich so bei mehreren Klassen die alle auf
diese Konstante zugreifen, aufpassen dass ich alle Header-Dateien
angepasst habe.
Die Frage ist jetzt, ob es eine Möglickeit gibt, das #define für alle
Klassen, sichtbar zu machen? Evtl. in den Toolchain Einstellungen vom
Projekt? Ein MAKEFILE scheint es beim Atmel Studio nicht zu geben.
Wenn jemand einen Tipp hat würde ich mich freuen
Alex
Deine Problembeschreibung verstehe ich zwar nicht so ganz (ein #define
vor einem #include sollte eigentlich immer funktionieren), aber am
einfachsten ist es, solche globalen defines per Compileroption
(-DF_CPU=1600000) zu definieren. Damit bist du sicher, daß alle
Sourcedateien den selben Wert bekommem.
EIntellen kannst du das in den Projeksettings.
Oliver
Hallo,
genau das habe ich gesucht. Habe es in den Projekteinstellungen
eingefügt und es funktioniert. Danke.
Das "Problem" liegt glaube ich am Compiler, so scheint er einfach zu
arbeiten. Da ich Uart.cpp, wo das define benötigt wird, ja nicht
wirklich inkludiere sondern nur die Header-Datei. Die Datei wird dann
nur an der Seite compiliert und der Linker findet dann später die
Methoden für die Klasse in diesem Objekt, welches aber außerhalb des
Projekts erstellt wurde.
So würde ich mir das erklären, kann aber nicht behaupten dass ich den
Zusammenhang zwischen Compiler und Linker zu 100% verstanden habe.
Deswegen kann ich nicht garantieren, dass meine Erklärung korrekt ist.
Alex
Alexander R. schrieb:> Die Datei wird dann> nur an der Seite compiliert
Dir ist aber schon klar, daß in der uart Object Datei das F_CPU=...
gesetzt ist mit der du die compiliert hast. Ob das dann zu deinem
aktuellen Projekt identisch ist weiß keiner ausser dir (vieleicht falls
du aufgepasst hast)
Wenn der Code von solchen externen defines abhängt, ist es weise, die C
Datei im Projekt immer neu zu compilieren.
Leute ihr habt doch keine 2000 C Dateien und alte Pentium 400 Rechner,
daß das ne halbe Stunde dauert, das geht doch innerhalb des Bruchteils
einer Sekunde, so what...
Preprozessor-Anweiseungen wie #include oder #define mache nur eine reine
Textersetzung. Compiler und linker bekommen davon nie etwas zu sehen.
Wenn du in der main.c ein #define definierst, dann ist das nur in der
main.c bekannt, dort aber auch in allen nach der Definition inkludierten
header-files.
Alexander R. schrieb:> Wenn ich nun in meiner Hauptdatei (nennen wir sie mal main.cpp) den Wert> für die Konstante F_CPU definiere und den Header von meiner Klasse> inkludiere, bekomme ich die im Betreff enthaltene Fehlermeldung.
Wenn du main.c kompilierst, kommt keine Fehlermeldung. Die kommt erst
bei uart.cpp
Oliver
Udo Schmitt schrieb:> Wenn der Code von solchen externen defines abhängt, ist es weise, die C> Datei im Projekt immer neu zu compilieren.
Könntest du das näher erklären?
Ich suche keinen Workaround, ich möchte schon wissen wie es korrekt
gemacht werden sollte.
Wenn ihr sagt, es ist sinnvoller das define in der Header-Datei zu
setzen, werde ich das tun.
Und ja, mir ist bewusst das der Präprozessor nur Text einfügt.
Alex
Udo Schmitt schrieb:> Leute ihr habt doch keine 2000 C Dateien und alte Pentium 400 Rechner,> daß das ne halbe Stunde dauert, das geht doch innerhalb des Bruchteils> einer Sekunde, so what...
Nun ja, nur weil man mit make etc. nicht umgehen kann, muß man seine
Unkenntnis nicht als generell richtig erklären. Immer alles neu
kompilieren ist nicht nötig.
Ein kleines, einigermassen reales Projekt mit vielleicht 20-30
Sourcedateien, kompiliert unterm avr-gcc mehrere Minuten. Das muß man
sich nicht antun, wenn es auch anders geht.
Oliver
Alexander R. schrieb:> Udo Schmitt schrieb:>> Wenn der Code von solchen externen defines abhängt, ist es weise, die C>> Datei im Projekt immer neu zu compilieren.>> Könntest du das näher erklären?>> Ich suche keinen Workaround, ich möchte schon wissen wie es korrekt> gemacht werden sollte.
'korrekt' ist immer so eine Sache :-)
Die beste Lösung ist es, solche Dinge wie F_CPU in den
Projekteinstellungen zu definieren. Denn diese Projekteinstellungen
werden dem Compiler immer mitgegeben, wenn er ein C-File compiliert.
Der Nachteil davon ist allerdings, dass man die Projekteinstellungen als
Teil des 'Source-Codes' ansehen muss. Denn wenn man sich nur die C-Files
bzw. Header-Files ansieht, dann findet man da ja nicht raus, welcher
Wert für F_CPU vorgesehen war.
Normalerweise ist das ja auch kein Problem. Es wird nur dann zum
Problem, wenn man das Entwicklungssystem wechselt. Denn die
C-Files/H-Files kann man, weil reine Text-Dateien, einfach direkt in die
neue Entwicklungsumgebung übernehmen. Aber die Projekteinstellungen kann
man normalerweise nicht so einfach übernehmen.
> Und ja, mir ist bewusst das der Präprozessor nur Text einfügt.
Was dir scheinbar noch fehlt, ist die Erkentnis, dass JEDES C-File für
sich alleine compiliert wird.
Wenn der Compiler main.c compiliert, dann kennt er nur die Dinge, die in
main.c geschehen. Plus natürlich die Dinge, die über die
Projekteinstellungen dem Compiler beim Aufruf mitgegeben werden
Wenn der Compiler uart.c compiliert, dann kennt er nur die Dinge, die in
uart.c geschehen. Plus natürlich ....
Jedes C-File wird für sich alleine compiliert und wenn der Compiler ein
anderes C-File compiliert, dann fängt alles wieder bei 0 an.
C kennt keine 'Projekte', so wie das zb in C# der Fall ist, wo der
Compiler darauf darauf angewiesen ist, quer über alle Source Code Files
Querverbindungen herzustellen. In diesem Sinne ist C minimalistisch. Ein
File - ein Compileraufruf - ein Ergebnis. Und erst wenn alle Einzelteile
cmopiliert sind kommt dann der Linker und baut aus den vorübersetzten
Einzelteilen das Komplettprogramm zusammen.
Oliver S. schrieb:> Nun ja, nur weil man mit make etc. nicht umgehen kann, muß man seine> Unkenntnis nicht als generell richtig erklären. Immer alles neu> kompilieren ist nicht nötig.
Ist es nicht, aber um 3 Sekunden (oder 0,3?) zu sparen sich mit Make ins
Knie zu schießen und evt. stundenlang Fehler zu suchen ist auch nicht
schlauer.
Und man kann sich mit Abhängigkeiten oder nicht angegeben Abhängigkeiten
wunderbar ins Knie schießen.
Oliver S. schrieb:> Das muß man> sich nicht antun, wenn es auch anders geht.
Die Frage ist obs anders geht, wenn er eine lib dazulinkt, die abhängig
von einem define ist, das je Prozessor oder gar individuellem Projekt
(F_CPU) unterschiedlich ist.
Oliver S. schrieb:> Ein kleines, einigermassen reales Projekt mit vielleicht 20-30> Sourcedateien, kompiliert unterm avr-gcc mehrere Minuten.
Ist das wirklich bei einem modernen Rechner so lahm?
Alexander R. schrieb:> Ich suche keinen Workaround, ich möchte schon wissen wie es korrekt> gemacht werden sollte.
jedes C File das von defines abhängt, die je nach Projekt
unterschiedlich sein können, musst du zwingend neu compilieren, sonst
ist dein Programm inkonsistent. Ob du das 'schlau' über make und
Abhängigkeiten machst oder 'dumm' mit "build all" ist erst mal egal.
Globale Defines würde ich wie beschrieben über eine gemeinsame
Compileroption machen, die für alle compiles benutzt wird. (Batch
script, make, wie auch immer)
Udo Schmitt schrieb:> Ist das wirklich bei einem modernen Rechner so lahm?
Ist es.
make etc. gibt es nun seit Anbegin der Zeitrechnung, heutzutage sogar
versteckt hinter der IDE. Das funktioniert.
Oliver
Oliver S. schrieb:> make etc. gibt es nun seit Anbegin der Zeitrechnung, heutzutage sogar> versteckt hinter der IDE. Das funktioniert.
Und es gibt auch Tools, die die Abhängigkeiten selber bestimmen.
Funktionieren ebenfalls.
Und Hand aufs Herz: Wenn man den Make-Mechanismus einmal durchschaut
hat, ist er nicht schwer zu benutzen. Auch für ganz andere Dinge, als
den C-Compiler anzuwerfen :-)
(Wer je in der Steinzeit mit PLINK ein Exe zusammenbauen musste, bei dem
die Funktionen in Overlays sich denselben Speicher teilen mussten, der
kann über das Thema Make oder Nicht Make nur müde lächeln. Da bist du
tatsächlich Stunden bzw. Tage dabei gesessen und hast mit Memory Maps
die Overlays ausgetüftelt, welche Funktion in welchem Segment sein muss,
damit sie a) aufrufbar ist und b) nicht zuviele Page Swaps passieren)
Karl Heinz Buchegger schrieb:> Die beste Lösung ist es, solche Dinge wie F_CPU in den> Projekteinstellungen zu definieren. Denn diese Projekteinstellungen> werden dem Compiler immer mitgegeben, wenn er ein C-File compiliert.
Im Atmel Studio 6 habe ich noch keine Option für die Frequenz gefunden.
Ist der Eintrag im -D Parameter das Gleiche?
> Was dir scheinbar noch fehlt, ist die Erkentnis, dass JEDES C-File für> sich alleine compiliert wird.
Soweit ich dass verstanden habe, produziert der Compiler von jeder Datei
erst ein Objekt, danach fügt der Linker es zu einem Komplettprogramm
zusammen. Dass ist jedenfalls das, was in meiner Vorlesung mal beiläufig
erwähnt wurde und was ich mir dann eher aus meinen Büchern zusammen
gesucht habe.
Das mit den Projekteinstellungen ist ein guter Punkt, da ich nicht
gewährleisten kann, dass jemand die gleiche IDE benutzt.
Um also alle nötigen Informationen im Quelltext mitzuliefern, scheine
ich nicht drum herum zu kommen, das F_CPU in der Header-Datei der Klasse
zu definieren.
Achso, ich benutze "Make all" im Atmel Studio, das sollte dann jede
Datei im Projekt kompilieren. Nur zur Vollständigkeit, weil es hier
öfters erwähnt wurde.
Karl Heinz Buchegger schrieb:> nd es gibt auch Tools, die die Abhängigkeiten selber bestimmen.> Funktionieren ebenfalls.>>> Und Hand aufs Herz: Wenn man den Make-Mechanismus einmal durchschaut> hat, ist er nicht schwer zu benutzen.
Und ich kenne den häufigsten Tipp von Kollegen wenn seltsames passiert:
"Mach mal ein komplettes Rebuild"
Wenn das make hinter einer funktionierenden IDE versteckt ist die sauber
alle Abhängkeiten aktuell anpasst dann ja. Wenn das aber eine mehr oder
weniger 'manuelle' toolchain ist wo man handisch im make rumeditiert,
dann sit ganz schnell ein neues h File bei den Abhängigkeiten vergessen.
Und wie gesagt, wenn ein komplettbuild nur ein paar Sekunden dauert,
wofür?
Das ist dann genauso wenig sinnvoll wie wenn jemand versucht im Code ein
paar µs Zeit zu sparen, und der Code dann für Benutzerinteraktion ist wo
sich der Prozessor zu 99,99% langweilt.
Meine Erfahrung mit großen C Projekten (PC über 1000 Sourcen und H
Files), allerdings schon Jahre her.
Udo Schmitt schrieb:> Und wie gesagt, wenn ein komplettbuild nur ein paar Sekunden dauert,> wofür?
Weil kein reales Projekt, das über ein Anfänger-"Hello world"
hinausgeht, in ein paar Sekunden vollständig kompiliert.
Alexander R. schrieb:> Das mit den Projekteinstellungen ist ein guter Punkt, da ich nicht> gewährleisten kann, dass jemand die gleiche IDE benutzt.
Ok, das ist ein Grund, die IDE-Projekteinstellungen nicht zu nutzen. In
dem Fall empfiehtl sich z.B eine header-Datei "global_defines.h" (oder
so), in der solche globalen Dinge definiert werden, und die du dann in
jedes header-File deines Projektes inkludierst.
Oliver
Oliver S. schrieb:> Weil kein reales Projekt, das über ein Anfänger-"Hello world"> hinausgeht, in ein paar Sekunden vollständig kompiliert.
Unser Großprojekt in der Firma bestand aus über 400 Sourcefiles, zum
Teil bis über 200K groß, etwa 200 h files und compilierte KOMPLETT auf
einem 400 MHz PC (>10 Jahre her) in etwa 40 min, mit einem 1600+ AMD
Prozessor des nächsten Rechners dann etwa 10-15 min.
Jetzt erzählst du mir ein µC Projekt mit ein paar kByte Code braucht euf
einem 3 GHz Rechner mehrere Minuten.
War jetzt der alte Microsoft Compiler so genial gut, oder sind die
Compiler für den AVR so scheiße???? Ich kanns nicht ganz glauben, muss
es wohl aber.
Ich programmiere hier praktisch ausschlisslich Java, und mit einem Core
I7 Rechner dauert das complette rebuild von Projekten mit um die 100
Sourcen auch nur < 1Minute, ein Ant komplettbuild mit Tests und Build
von War Files (zum teil sogar umpacken includierter jars und Wars )im
Bereich von 1 - 4 Minuten.
Alexander R. schrieb:> Karl Heinz Buchegger schrieb:>> Die beste Lösung ist es, solche Dinge wie F_CPU in den>> Projekteinstellungen zu definieren. Denn diese Projekteinstellungen>> werden dem Compiler immer mitgegeben, wenn er ein C-File compiliert.>> Im Atmel Studio 6 habe ich noch keine Option für die Frequenz gefunden.> Ist der Eintrag im -D Parameter das Gleiche?
Ja, ist dasselbe.
Im alten AVR-Studio gabs dafür ein eigenes Edit-Feld, aber letzten Endes
mündete das auch in einem -DFCPU=.... welches dem Compiler mitgegeben
wird.
Alexander R. schrieb:> Um also alle nötigen Informationen im Quelltext mitzuliefern, scheine> ich nicht drum herum zu kommen, das F_CPU in der Header-Datei der Klasse> zu definieren.
Das wiederrum ist keine so gute Idee.
Da ist es noch besser, ein globales Header-File zu machen, das
zwingsweise von jedem includiert werden muss. Und wenn der include
vergessen wurde, dann beschwert sich der Compiler, dass er F_CPU nicht
kennt.
Was du erreichen willst: Egel wieviele C-Files du im Projekt hast, du
willst nur an einer einzigen Stelle die Definition von F_CPU physisch
haben. Denn nur so ist 100% gewährleistet, dass tatsächlich alle C-Files
mit demselben Zahlenwert arbeiten. Hast du im Projekt mehrere
Definitionen verstreut, besteht immer die Gefahr, dass diese nicht
zusammenstimmen. Und dagegen kann dich ausser dir selber (und deinem
Gedächtnis) niemand schützen. Das mag dir heute noch nicht als Prpblem
erscheienen, aber wenn du in 2 Jahren das Projekt noch mal vorkramst um
es auf eine andere Schaltung mit anderer Taktfrequenz umzustellen,
darfst du dann nicht vergessen ALLE F_CPU Definitionen anzupassen. Und
wie das halt so ist ... als Mensch macht man Fehler und vergisst bzw.
übersieht Dinge gern.
Genau aus dem Grund bin ich auch kein Freund der Methode ....
1
#ifndef F_CPU
2
#define F_CPU 1000000UL
3
#endif
..., meinetwegen noch mit einer Warnung garniert (die eh keiner liest).
Wenn F_CPU fehlt, dann sollte man das IMHO ruhig mit einem Error
quittieren und keine Standardannahmen treffen, die dann ohnehin nicht
stimmen und in Fehlersuche ausarten.
Udo Schmitt schrieb:> Oliver S. schrieb:>> Weil kein reales Projekt, das über ein Anfänger-"Hello world">> hinausgeht, in ein paar Sekunden vollständig kompiliert.> Unser Großprojekt in der Firma bestand aus über 400 Sourcefiles, zum> Teil bis über 200K groß, etwa 200 h files und compilierte KOMPLETT auf> einem 400 MHz PC (>10 Jahre her) in etwa 40 min, mit einem 1600+ AMD> Prozessor des nächsten Rechners dann etwa 10-15 min.
Das Projekt, an dem ich zur Zeit bin, compiliert des Nachts auf einem
eigenen Compile-Server komplett durch. Dauer: ungefähr von halb 1 Uhr
morgens bis knapp nach 5. Wir haben extra eine Mehrkern-Maschine dafür
abgestellt, denn ein einziger Kern hat es in einer Nacht alleine nicht
mehr geschafft :-)
(Ist aber kein AVR-Projekt - sollte aber klar sein :-)
Karl Heinz Buchegger schrieb:> Das Projekt, an dem ich zur Zeit bin, compiliert des Nachts auf einem> eigenen Compile-Server komplett durch. Dauer: ungefähr von 2 Uhr morgens> bis knapp nach 5
Glaube ich dir gerne :-) Wenn ich alle Compiles für alle
Betriebssysteme, Rechner und Datenbanken dazunehme, komme ich bei uns
auch auf Zeiten > 8h pro Nacht (Ohne Tests).
Ich wollte damit nur deutlich machen, daß ich es kaum glauben kann daß
es bei modernen Rechnern lohnt für 8Bit µCs keine Komplett Builds laufen
zu lassen.
Speziell Anfänger, die das halt nur hobbymäßig betreiben können mit nur
halb verstandenen make skripten in wunderbare Fallen laufen.
Karl Heinz Buchegger schrieb:> Was du erreichen willst: Egel wieviele C-Files du im Projekt hast, du> willst nur an einer einzigen Stelle die Definition von F_CPU physisch> haben. Denn nur so ist 100% gewährleistet, dass tatsächlich alle C-Files> mit demselben Zahlenwert arbeiten.
Genau das war das Ziel. Habe deswegen, wie Oliver S. vorgeschlagen
hatte, eine Datei global_definitions.h erstellt und inkludiere sie nun
in meinen Header-Dateien.
Ich danke euch allen für eure Hilfe.
Alex
Udo Schmitt schrieb:> Ich wollte damit nur deutlich machen, daß ich es kaum glauben kann daß> es bei modernen Rechnern lohnt für 8Bit µCs keine Komplett Builds laufen> zu lassen.
Ne ne, das passt schon.
2 Punkte:
* zum einen, meine Meinung, sollte man sich schon an gewisse Standards
halten. Hilft nichts - in der Programmierung muss man eben vieles
lernen.
* zum anderen hilft dir ein Make All auch dann nicht, wenn du mehrere
sich widersprechende F_CPU im System hast. Und das ist für mich
eigentlich einer der wichtigeren Punkte in diesem Thread.
Ob ein Make All jetzt 20 oder 30 Sekunden dauert (weil die Ausgabe
der Fehlermeldungen so langsam ist) ist hingegen zweitrangig.
Tja, das Thema mit make :-)
Ich hab mich mal 3 Tage intensiv damit beschäftigt und ein, meiner
Meinung nach, gutes und durchdachtes makefile erstellt. Dieses dient mir
immer als Vorlage für neue Projekte.
Abhängigkeiten werden dynamisch bestimmt, sollte klar sein. Sowas per
Hand zu pflegen geht gar nicht :-)
Mittlerweile klappt das bei mir besser als in der Firma. Da ist in der
Tat manchmal ein build-all nötig weil der Linker ein Symbol nicht
auflösen kann (das eigentlich garnicht mehr vorhanden wäre, hätte der
Compiler das Objekt neu angelegt).
Damit kompiliere ich eigentlich für sämtliche Plattformen mittlerweile.
Egal ob embedded, Kommandozeile, QT-Gui...
Ein absolutes no-go sind für mich IDE-spezifische Projekteinstellungen.
Ich war es leid, jedesmal wieder die passende IDE mit den passenden
PlugIns zusammenzubasteln und die Einstellungen durchzugehen.
Ich bin der Meinung, ein C oder C++ Projekt sollte sich mit einem Aufruf
von make erstmal kompilieren lassen.
Diese strikte Trennung von IDE und eigentlichen Sourcen halte ich für
sehr wichtig.
Die GNU-Toolchain wirds auch dann noch geben wenn Borland, MS oder
Eclipse lange Geschichte sind (Achtung, Satz enthält wagemutige
Prognosen!).
Mich hindert trotzdem nichts daran, Eclipse zu benutzen. Ganz im
Gegenteil, finde ich super. Aber ich bin zu keinem Zeitpunkt von Eclipse
(oder dem AVR-Plugin) abhängig.
Aber ich schweife ab.
Im makefile können dann nach Belieben Vereinbarungen getroffen werden,
die für das komplette Projekt gelten, wie eben F_CPU.
Zur Not eben die Lösung mit dem Zentralen Header-File.
Sowas ist eigentlich garnicht aufwändig, meist hat man eh einen extra
Header für z.B. Typen wie uint8. (Ich mappe den zB auf uint8_t aus den
AVR-Headern. Aber vielleicht hab ich mal eine Toolchain ohne eingebauten
uint8_t).
Wenn man Code für den AVR weitergibt, kann man das Definieren von F_CPU
imo guten Gewissens demjenigen überlassen, der ihn benutzt. Das heißt,
es sollte allgemein bekannt sein, dass man F_CPU definieren muss. Ob
derjenige das dann in seinen Projektoptionen macht oder lieber ein
#include config.h im Code ergänzt, sei ihm überlassen.
Ich würde aber keinen Defaultwert vorgeben, denn der muss ja nicht der
tatsächlichen Taktfrequenz entsprechen. Und dann kann man lange den
Fehler suchen ...
Udo Schmitt schrieb:> Und ich kenne den häufigsten Tipp von Kollegen wenn seltsames passiert:> "Mach mal ein komplettes Rebuild">> Wenn das make hinter einer funktionierenden IDE versteckt ist die sauber> alle Abhängkeiten aktuell anpasst dann ja.
Eine IDE brauchst du dafür gar nicht. Wie schon Karl Heinz sagte, gibt's
für die Abhängigkeiten Tools. Eins davon heißt gcc. Der kann nämlich
selber entsprechende Regeln für make erzeugen, die alle
include-Abhängigkeiten beinhalten.
> Und wie gesagt, wenn ein komplettbuild nur ein paar Sekunden dauert,> wofür?
Ich bin jemand, der immer in sehr kleinen Schritten programmiert. Also
ein paar Zeilen ändern, neu bauen und ausprobieren. Da ist es wichtig,
daß der 2.Schritt möglichst kurz ist, denn das ist Zeit, die ich einfach
wartend vor dem PC sitzen muß. Da nerven auch 10 Sekunden schon.
Udo Schmitt schrieb:> Ich programmiere hier praktisch ausschlisslich Java, und mit einem Core> I7 Rechner dauert das complette rebuild von Projekten mit um die 100> Sourcen auch nur < 1Minute, ein Ant komplettbuild mit Tests und Build> von War Files (zum teil sogar umpacken includierter jars und Wars )im> Bereich von 1 - 4 Minuten.
Und du findest es akzeptabel, nach jeder winzigen Änderung zum Testen 4
Minuten zu warten, bis der komplett-Build fertig ist? Ich nicht.
xfr schrieb:> Ob> derjenige das dann in seinen Projektoptionen macht oder lieber ein> #include config.h im Code ergänzt, sei ihm überlassen.
Es sollte allerdings an einer Stelle sein, an der man es schnell findet.
Da ist mir ein globales headerfile mit aussagekräftigem Namen lieber,
als eine Definition im makefile. Denn auch make ist nicht gleich make.
Wer das Projekt lieber in einer IDE mit automatisch erzeugten makefile
nutzen will, muß sich mühsam die defines aus dem makefile suchen. Mit
einem header funktioniert das immer und überall.
Oliver