Präprozessordefinition für Visual C++?
-
Wie MFK bereits gesagt hat, gibt es eben doch einen define, der automatisch von VC++-Compilern gesetzt wird. Du kannst damit sogar zwischen verschiedenen Versionen des VC++ unterscheiden. Näheres, siehe: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcechp40/html/ccrefPredefinedPreprocessorIdentifiers.asp
-
Vielen Dank an alle!
-
Zu früh gefreut.
#ifdef _MSC_VER #include "stdafx.h" #endiffunktioniert leider nicht. Das Programm ist in C geschrieben und VC++ verlangt irgendwie immer in allen .cpp Dateien, die mitgelinkt werden sollen, dass stdafx.h eingebunden ist. Wenn ich den Schalter /Yu"stdafx.h" ausstelle, dann linkt er die Dateien nicht mit. Gibt es da eine andere Lösung?
-
dann linkt er die Dateien nicht mit
Glaub ich nicht

C und C++ haben verschiedene Namenskonventionen, die der Linker sieht.
Wenn die Funktionen als extern "C" deklariert sind, oder die gleichen Header von .c und .cpp - Dateien reingeladen werden, findet der Linker bestimmte Funktionen nicht.Was bekommst Du für Fehlermeldungen?
-
Ich hab zwar dein Problem nicht ganz verstanden, aber wenn es dir um die Unterscheidung zwischen C und C++ Übersetzungseinheit geht, gibt es das schöne Makro __cplusplus.
#ifdef __cplusplus // hier C++ spezifischen Code rein #else // hier C spezifischen Code rein #endif
-
Ich glaube ich habe mein Problem nicht gut erklärt. Ich fange mal von vorne an. Es geht um Folgendes:
Ich habe ein Programm mit Dev-C++ in C geschrieben. Alles läuft wunderbar, kompiliert sauber und funktioniert. Dann wollte ich für dieses Programm noch eine Erweiterung mit Visual C++ in C schreiben, da Dev-C++ für diese spezielle Aufgabe wegen der Ide ungeeignet ist. Der Code aus den Projekten ist auf mehrere Dateien aufgeteilt. Dev-C++, das per default mingw (GCC) benutzt linkt Dateien zu der .exe, die im Projekt eingebunden sind. Nun brauche ich Codedateien aus dem ersten Projekt auch im VC++ Projekt. Allerdings linkt VC++ nur Dateien, die "stdafx.h" eingebunden haben. Wenn diese nicht eingebunden ist, dann bekomme ich den Fehler "fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei". Diese Geschichte mit stdafx.h lässt sich durch entfernen von /Yu"stdafx.h" in den Linkeroptionen ausschalten. Wenn ich das tue, dann linkt er die Dateien immernoch nicht mit, ich bekomme nur einen Haufen unaufgelöster Symbole. Meine Frage ist also:
Da beide Projekte später sowohl von VC++ als auch von Dev-C++ compiliert werden muss es eine möglichkeit geben das Includen von stdafx.h von einer Präprozessordefinition abhängig zu machen, die logischerweise nur greift, wenn man mit VC++ kompiliert.
-
Was sind denn das für nicht aufgelöste externe Symbole?
Hast du schonmal nen Rebuild All gemacht?
-
dEUs schrieb:
Was sind denn das für nicht aufgelöste externe Symbole?
Das sind bei VC++ Funktionen, deren Köpfe in Headerdateien deklariert sind, aber deren vollständiger Inhalt in einer Codedatei oder Library steht, die anscheinend nicht mitgelinkt wurde.
dEUs schrieb:
Hast du schonmal nen Rebuild All gemacht?
Ja, hat absolut nichtsgebracht, leider.
-
hackbert schrieb:
dEUs schrieb:
Was sind denn das für nicht aufgelöste externe Symbole?
Das sind bei VC++ Funktionen, deren Köpfe in Headerdateien deklariert sind, aber deren vollständiger Inhalt in einer Codedatei oder Library steht, die anscheinend nicht mitgelinkt wurde.
Haha

Meinst du ich bin umsonst hier Mod? Natürlich weiss ich, was nicht aufgelöste externe Symbole sind. Ich wollte deine wissen!
-
Sorry, hab die Frage missverstanden. Das unaufgelöste externe Symbol ist eines aus dem ersten Projekt. Es handelt sich nicht um eine Bibliotheksfunktion, wenn Du darauf hinaus möchtest. Ich habe die zugehörige Headerdatei eingebunden, ebenso habe ich die Codedatei zum Projekt hinzugefügt. Offensichtlich wird die aber nicht mitgelinkt und deshalb bekomme ich das unaufgelöste externe Symbol.
-
hackbert schrieb:
Da beide Projekte später sowohl von VC++ als auch von Dev-C++ compiliert werden muss es eine möglichkeit geben das Includen von stdafx.h von einer Präprozessordefinition abhängig zu machen
Das wurde von MFK ja bereits beantwortet (-> _MSC_VER). Da das offensichtlich nicht hilft, wie du geschrieben hast, solltest du dir Gedanken über einen anderen Lösungsansatz machen.
stdafx.h ist glaub ich ein Header, den VC++ bei MFC Projekten erstellt (kann mich da aber auch irren). Prüfe nochmal, ob du diese Datei wirklich brauchst. Noch ein Tipp, schalte im VC++ das Benutzen von vorkompilierten Headern aus.
-
hackbert schrieb:
Offensichtlich wird die aber nicht mitgelinkt und deshalb bekomme ich das unaufgelöste externe Symbol.
Oder die Deklaration der Methoden unterscheidet sich von der Definition - zB ein const vergessen?
-
Shade Of Mine schrieb:
Oder die Deklaration der Methoden unterscheidet sich von der Definition - zB ein const vergessen?
Definitiv nicht, kompiliert mit mingw ja perfekt!
groovemaster2002 schrieb:
Noch ein Tipp, schalte im VC++ das Benutzen von vorkompilierten Headern aus
Wie geht das denn? /Yu"stdafx.h" habe ich ja schonmal entfernt.
Und was bringen vorkompilierte Headerdateien eigentlich?
-
hackbert schrieb:
groovemaster2002 schrieb:
Noch ein Tipp, schalte im VC++ das Benutzen von vorkompilierten Headern aus
Wie geht das denn?
Das kann man in den Projekteinstellungen verändern. Welche VC++ Version benutzt du denn?
-
Visual C++ 6.0
-
Bei Version 6.0 kann ich dir leider nicht helfen, da ich es nicht mehr auf dem Rechner hab. Musst halt mal alles in den Projekteinstellungen durchschauen. Da gibts irgendwo die Einstellung für vorkompilierte Header.
-
Hallo,
vorkompilierte Header ausschalten:
Projekt-Einstellungen, Register C/C++, Kategorie "Vorkompilierte Header"-> nicht verwenden.
MfG
-
Das bewirkt das gleiche wie das Entfernen von /Yu"stdafx.h". Ich bekomme dann immernoch ein unaufgelöstes externes Symbol. Kann das vielleicht daran liegen, dass die zugehörige Codedatei nicht im selben Verzeichnis liegt?
-
Unaufgelöstes externe Symbole entstehen immer dann, wenn Funktionen deklariert, aber nicht definiert sind. Schau dir das unaufgelöste externe Symbol an, und prüfe ob es in einer eingebundenen Übersetzungseinheit definiert bzw. in einer mitgelinkten Lib vorhanden ist.
-
Alle Libs und auch die zugehörige Codedatei sind im Projekt eingebunden. Anscheinend werden diese aus irgendeinem Grund nicht mitgelinkt. Meine Frage war: kann VC++ nur Dateien mitlinken, die im selben Verzeichnis oder einem Unterverzeichnis des Projekts liegen? die entsprechende Codedatei liegt nämlich eine Verzeichnisebene höher...