Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Nico

Frischling

  • »Nico« ist der Autor dieses Themas

Beiträge: 82

Wohnort: Nürnberg

  • Private Nachricht senden

1

22.11.2007, 09:49

Vorkompilierte Header mit dem MSVC++

Einleitung

Jeder, der einmal an einem großen Projekt gearbeitet hat, kennt das:
Die Kompilierzeit steigt und steigt. Und das liegt nicht zuletzt an der mitsteigenden Anzahl der Headerdateien die eingebunden werden müssen. Und viele dieser Dateien wiederholen sich auch, da sie für jede .c/.cpp Datei extra benötigt werden.
Diese Zeit kann man unter VC++ (und auch anderen Compilern) drastisch senken. Mit vorkompilierten Headern.

Setup

Erstmal brauchen wir 2 Dateien: stdafx.h und stdafx.cpp. Diese werden zwar standardmäßig erstellt, viele verwenden aber oft leere Projekte. Diese Dateien können btw heissen wie Ihr wollt, der MSVC verwendet diese Namen nur eben als Standard.
Sollten sie nicht im Projekt bestehen, erstellt sie und fügt sie hinzu.

Die Einstellungen

Macht nun folgendes:
Eigenschaften des Projekts -> C/C++ -> Vorkompilierte Header.
Dort wählt Ihr in der oberen Spalte "Vorkompilierte Header verwenden".
In der nächsten Spalte schreibt Ihr rein: stdafx.h
Dann auf ok klicken.

Jetzt wählt Ihr die Datei stdafx.cpp. Auch dort
Eigenschaften -> C/C++ -> Vorkompilierte Header
Dort ändert Ihr nun die erste Spalte auf "Vorkompilierte Header erstellen".
Sonst lasst Ihr alles gleich.

Inhalt der Dateien

stdafx.h

Hier schreibt ihr alle Header rein, die Ihr verwendet. Allerdings empfehle ich, nur konstante Header zu verwenden, also eben jene aus der STL oder anderen API. Ansonsten wird das Projekt zu oft neu kompiliert, was den SpeedBonus wieder zunichte macht. Den include-guard natürlich nicht vergessen.

stdafx.cpp

In diese Datei schreibt Ihr nur

C-/C++-Quelltext

1
#include "stdafx.h"

rein. Sonst nichts.

In die restlichen .cpp Dateien eures Projekts muss jetzt als erstes include die stdafx.h rein, damit das richtig funktioniert. Das kann bei einem größeren Projekt etwas Arbeit werden, aber es lohnt sich.

Fazit

Wie man sehen kann, ist das ziemlich einfach. Aber es ist gleichzeitig auch ziemlich mächtig. So konnte ich die BuildZeit bei meiner aktuellen GameEngine (OpenGL) mit 13.000 Zeilen Code (ohne Kommentare) und knapp 105 .cpp Dateien von 1 Minute 20 auf 15 Sekunden drücken, wenn der vork. Header gebaut ist.

Ich hab das hier mal zusammengefasst, in der Hoffnung, dass es jemand was nutzt. Bei Fragen/Kritik immer los ;).
lg

BlazeX

Alter Hase

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

2

18.12.2009, 19:13

Hallo!
Ich schreib auch gerade eine Engine (aber DirectX) und da wächst die Build-Zeit auch beständig. Deshalb wollte ich auch PCHs verwenden.
Aber: Ich habe ticpp (TinyXml++) mit drin und da gibt es Fehlermeldungen ala:

Quellcode

1
2
3
4
5
6
7
8
...\ticpp.cpp(30) : warning C4627: "#include "ticpp.h"": Wird bei der Suche nach Verwendung des vorkompilierten Headers übersprungen.
"StdAfx.h" Direktive hinzufügen oder vorkompilierten Header erneut erstellen
...\ticpp.cpp(992) : fatal error C1010: Unerwartetes Dateiende während der Suche nach dem vorkompilierten Header. Haben Sie möglicherweise vergessen, im Quellcode "#include "StdAfx.h"" einzufügen?
tinystr.cpp
...\tinystr.cpp(32) : warning C4627: "#include "tinystr.h"": Wird bei der Suche nach Verwendung des vorkompilierten Headers übersprungen.
...
..
.


Eine Lösung für das Problem:
Ein simples #include"StdAfx.h" oder für spezielle Pfade #include"../../DasProjekt/StdAfx.h" zu Beginn aller Source-Dateien (*.cpp) aus dem ticpp Ordner.
Das wären:
ticpp.cpp
tinystr.cpp
tinyxml.cpp
tinyxmlerror.cpp
tinyxmlparser.cpp

Weiterhin kann ein #pragma warning(disable: 4996) in der Datei tixml.cpp auch nicht schaden.


PS: Das beste wären jetzt noch Vorgelinkte Header ;)

unsigned long

Treue Seele

Beiträge: 140

Wohnort: Herzogenrath

Beruf: Fachinformatiker Fachrichtung Anwendungsentwicklung

  • Private Nachricht senden

3

25.12.2009, 22:02

Also ich will mal nichts sagen, aber 13k Zeilen Code in 105 cpp-Dateien (also ~120 Zeilen pro Datei) finde ich schon als recht "interessante" Aufteilung.

Anyway. Also meine betrieblichen Projekte umfassen oft das Zehnfache an Code und dort habe ich auf einem einfachen Core 2 Duo beim ändern der zentralen Header-Datei nur 25 sec. complete rebuild.

Man sollte nur #pragma once kennen.

Precompiled Header und co. sind doch noch aus Zeiten, wo die Prozessoren noch nicht mal an der GHz-Grenze gekratzt haben und ich kann nur empfehlen diese Teile nicht mehr zu benutzen, da diese oft nur sehr bedingt kompatibel zu anderen Compilern sind.

BlazeX

Alter Hase

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

4

28.12.2009, 11:22

Aber sie halten, was sie versprechen: Die Build-Zeit wird drastisch reduziert. Und das will wohl jeder.

Und wie oft wechselt man den Compiler?
Ich arbeite mit MSVC++ 2008 SP1. Der Umstieg vom 2005er verlief reibungslos.

unsigned long

Treue Seele

Beiträge: 140

Wohnort: Herzogenrath

Beruf: Fachinformatiker Fachrichtung Anwendungsentwicklung

  • Private Nachricht senden

5

29.12.2009, 16:51

Kommt drauf an auf wie vielen Plattformen die Applikation laufen soll. Wenn man noch für viele Windows 3.11 Embedded-Systeme (z. B. Kassensysteme, Banksysteme usw.) support leisten will oder coden muss, kommt man mit einem Visual Studio 2010 nicht weit. Da kann man höchstens Visual Studio 6 benutzen und das auch nur bedingt.

Ich habe es oft, dass ich noch für Windows 98 SE oder NT coden muss aber meine Applikationen auch auf Win7 laufen müssen. Wie schon gesagt, so verallgemeinern kann man den Wechseln von Compilern nie.

Klar verringern die vorkompilierten Dateien die Übersetzungszeit, aber ich muss sagen hier kommt es so rüber: "Hey, dann mach doch mal alle Dateien vorkompiliert, dann geht es noch schneller". Dieser Punkt ist für mich der hauptsächliche Nachteil. Es ist wie bei einem Gespräch mit einem Vertreter von einer Versicherung oder Bank: Es werden nur Vorteile erzählt, aber die Nachteile sollten umbedingt nachgefragt werden, da die gerne nicht genannt werden. Die Nachteile von den Teilen sind nicht gerade hmn... nennen wir es mal "mager".

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

29.12.2009, 17:03

Hmm. Das ist denke ich durchaus ein Grund, aber ich meine bei solchen Projekten kommt so eine Frage ja denke ich gar nicht auf, weil da halt ja alles eh schon etabliert ist und da wird sich kaum jemand denken, ach hej, wir können ja unsere 20 Jahre altes System mit PCH kompilieren. ;)
Auf so ne blöde Idee kommt niemand, auch wenn er noch so ein grosser Fan von PCH ist. :)

Aber ich denke, wenn man eigene Projekte hat und selbst Herr über das ganze ist, dann kann man sich die imo durchaus leisten. Vor allem, wenn man nicht vorhat, dass das Projekt Jahrzente weiterentwickelt/Supportet wird.

Ich benutze PCH selbst sehr gerne, weil es halt wirklich enorme Verbesserungen der Kompilierzeit mitbringt.

C--

Alter Hase

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

7

29.12.2009, 18:22

Ich hab zwar bisher noch nie mit PCH's geabeitet, aber durch das gute Tutorial werde ich es mir noch mal überlegen.
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

29.12.2009, 19:10

Selbst wenn der Compiler keine vorkompilierten Header unterstützt, ist an dem Code nichts verkehrt. Er kompiliert halt nur langsamer.

unsigned long

Treue Seele

Beiträge: 140

Wohnort: Herzogenrath

Beruf: Fachinformatiker Fachrichtung Anwendungsentwicklung

  • Private Nachricht senden

9

29.12.2009, 23:06

es lebt....:shock:

anyway. Natürlich ist der Code für die gängigen Compiler gleich, bestreite ich ja nicht. Solang es nur um die gängigen geht. Ich finde aber diese Ansage: "Hey, mach alles precompiled" mehr als falsch.

Werbeanzeige