StdAfx-Fehler



  • Wenn ich ein Programm mit dem Anwendungs-Assistenten erstelle und ich füge diesem eine CPP-Datei hinzu, dann muß sie als erstes immer die Zeile

    #include "StdAfx.h"
    

    haben. Ansonsten kommt folgender Fehler:

    fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei

    Wenn ich jedoch selbst ein MFC-Programm, ohne Anwendungs-Assistent, schreibe, dann habe ich da gar keine "StdAfx", weil ich in jeder Datei, wo es nötig ist, einfach nur

    #include <afxwin.h>
    

    schreibe. Und hier kommt kein Fehler.
    Mein Problem ist nun: Wie kann ich eine beliebige allgemeine Klasse für MFC-Anwendungen schreiben, die sowohl bei automatisch (mit "StdAfx"), als auch bei manuell erstellten Projekten (ohne "StdAfx") funktioniert? Und außerdem: Wieso verlangt der Compiler so penetrant diese Include-Zeile bei jeder CPP-Datei?



  • Wenn du ein leeres Projekt erstellst, kommt diese Problematik nicht auf.
    Dieser Header dient aber dazu, die Compilezeit zu verkürzen, wenn du selten ändernde Header dort einbindest, müssen die nicht jedesmal neu kompiliert werden.
    However, ich mag diesen Header auch nicht, erzeuge leere Projekte, mache aber einen "global.h" wo ich häufig benutzte, aber selten ändernde Header einbinde, und globale Konstanten definiere, wie SCREEN_WIDTH o.ä.



  • Alle Includes aus der stdafx.h werden vorkompiliert, was den Biuld-Vorgang mitunter erheblich verkürzt. In den Projekteinstellung unter C++/Vorkompilierte Header kannst du diese Header-Datei auch manuell einstellen bzw. entfernen.



  • Mein Problem ist eigentlich folgendes: Ich habe eine allgemeine Klasse geschrieben, die für MFC-Anwendungen verwendet wird. Und die soll sowohl für selbst erstellte als auch für automatisch erstellte Projekte funktionieren. Lasse ich nun

    #include "StdAfx.h"
    

    in der CPP-Datei weg, meckert er bei automatisch erstellten Projekten, daß er den vorkompilierten Header nicht gefunden hat. Schreibe ich ihn hin, kann er die "StdAfx.h" bei manuell erstellten Projekten natürlich nicht finden. Was ich jetzt brauche, ist eine Möglichkeit im Stil von

    #if PROGRAMM_WURDE_AUTOMATISCH_ERSTELLT
    #include "StdAfx.h"
    #endif
    

    bzw.

    #if EXISTS ("StdAfx.h")
    

    Gibt es da etwas in der Art? Denn es nützt mir ja nichts, wenn ich selbst die Projekteinstellungen ändern kann. Aber jemand anderes, der das nicht macht, soll ja ebenso mit derselben Klasse arbeiten können.



  • Da bis jetzt noch niemand geantwortet hat, muß ich nochmal nachfragen. Ich habe also, wie gesagt, eine allgemeine Klasse (die in der Zwischenzeit nichtmal mehr nur für MFC-Anwendungen ist). Also:

    Meine Klasse.h:

    #ifndef MEINE_KLASSE_H
    #define MEINE_KLASSE_H
    
    class MeineKlasse
    {
    public:
    
        MeineKlasse ();
    
        //...
    };
    
    #endif
    

    Meine Klasse.cpp:

    #include "Meine Klasse.h"
    
    MeineKlasse::MeineKlasse ()
    {
        //...
    }
    
    //...
    

    Wie kriege ich es hin, daß diese Dateien auch in ein MFC-Projekt eingebunden werden können, das vorkompilierte Header benutzt und bei dem sonst immer der Fehler

    fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei

    kommt? Man beachte: Es sind allgemeine Dateien, die, wenn fertig, für jegliche Projekte funktionieren sollen, ohne daß sie verändert werden müssen. Ich kann da weder reinschreiben: "Wenn Ihr meine Klasse benutzen wollt, bereitet Euer Projekt bitte so vor, daß Ihr keine vorkompilierten Header-Dateien habt!", noch: "Bitte fügt in die CPP-Datei den Befehl #include "StdAfx.h" ein!"



  • Wenn du deine Klassen wiederverwendbar machen willst bzw. sie sollen in anderen Projekten wieder verwendet werden, macht man daraus eigentlich eine separate Library (im VS-Jargon ein separates Projekt in einer Solution). Soll heißen: erstelle ein neues Projekt als Win32-Library. Und dann kannst du selbst bestimmen, was du speziell für diese Lib benutzen willst: PCHs oder doch keine PCHs. Das ist dann unabhängig von allen anderen Projekten compilierbar. Außerdem könntest du auch nur eine fertige *.LIB plus Headers weiter geben ohne das sich jemand um Neukompilieren kümmern muß.

    Also, möglich ist es auf jeden Fall. Mußt halt nur die richtige Strategie wählen. 😃



  • Ja, klar könnte ich eine Lib-Datei erstellen, die ich dann mit dem Header weitergebe. Aber was ist, wenn das ganze tatsächlich mit offenem Quellcode verbreitet werden soll? Wenn der Benutzer die CPP- und keine Lib-Datei einbauen können soll. Das muß doch irgendwie gehen, daß ich eine allgemeine Klasse mit H- und CPP-Datei habe, die in einem Projekt unabhängig davon funktioniert, ob dieses Projekt nun vorkompilierte Header benutzt oder nicht.

    Noch eine andere Frage: Wenn ich eine eigene Lib ohne MFC erstelle und diese in ein MFC-Programm einbinde:

    #pragma comment (lib, "Meine Lib.lib")
    

    kommt immer folgende Warnung:

    warning LNK4098: Standardbibliothek "libc.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULT:Bibliothek verwenden

    Wie man die umgeht, ist ja simpel. Man schreibt einfach:

    #pragma comment (linker, "nodefaultlib:libc.lib")
    

    Meine Frage ist nun: Wieso steht diese libc.lib überhaupt mit anderen Bibliotheken im Konflikt? Das passiert selbst, wenn ich nur eine Klasse habe, welche eine Funktion besitzt, die eine Message-Box anzeigt.


Anmelden zum Antworten