Hallo zusammen,
ich habe ein Problem mit mehrfach definierten Symbolen. Im folgenden Beispiel nenne ich dabei nur _d3d9. Dabei habe ich den Verdacht, dass #pragma once irgendwie nicht funktioniert. Dabei ist mein C++-Compiler der von VS2010, und da sollte es mit dieser Direktive nun keine Probleme mehr geben.
Um das Problem zu erläutern, müsste ich mal die Projektdateien und darin enthaltene #include-Direktiven und Variablen in Reihenfolge ihres Auftretens auflisten. Ich versuche mal, es übersichtlich zu halten. Meine Erklärung weiter unten macht es vielleicht verständlicher. Zur Not schicke ich einem engagierten Helfe (danke!) via PM auch mein aktuelles Projekt.
Die Header grün, die CPPs blau. Includes und Pragma once fett.
Die angeblich mehrfach definierte Variable in rot (sie dient als Einzelbeispiel - es sind aber noch mehr Symbole vorhanden, die auch alle mehrfach definiert seien). Das #include, was diesen Fehler verursacht, auch rot:
Engine3D.h - #pragma once - Definiert global z.B. _d3d9, die Direct3D-Schnittstelle - #include "List.h", #include "Resource.h", #include "ResourceManager.h"
List.h - #pragma once - Nicht relevante weitere Definitionen
Resource.h - #pragma once - Nicht relevante weitere Definitionen
ResourceManager.h - #pragma once - Nicht relevante weitere Definitionen
Engine3D.cpp - #include "Engine3D.h" - Nicht relevante weitere Definitionen
ResourceManager.cpp - #include "Engine3D.h"
Dieser Fehler tritt z.B. auf, sobald ich in ResourceManager.cpp "#include "Engine3D.h" einfüge:
error LNK2005: "struct IDirect3D9 * Engine3D::_d3d9" (?_d3d9@Engine3D@@3PAUIDirect3D9@@A) ist bereits in ResourceManager.obj definiert.
Aber wie kann das sein? Ich sehe das so:
Die Engine3D-Headerdatei wird durchlaufen. In ihr wird das erste mal die _d3d9-Variable definiert.
Aufgrund des #pragma once in dieser Datei können andere #include "Engine3D.h"-Anweisungen da nicht nochmal rüberlaufen und die Variable erneut definieren.
Aber das geschieht doch, sobald ich in einer zweiten CPP-Datei (hier ja die ResourceManager.cpp) "#include "Engine3D.h" schreibe.
Die Projektausgabe sagt dazu auch folgendes:
|
Quellcode
|
1
2
3
4
5
6
7
|
1>------ Erstellen gestartet: Projekt: Engine3D, Konfiguration: Debug Win32 ------
1> Engine3D.cpp
1> Code wird generiert...
1> Kompilieren...
1> ResourceManager.cpp
1> Code wird generiert...
1>Engine3D.obj : error LNK2005: "struct IDirect3D9 * Engine3D::_d3d9" (?_d3d9@Engine3D@@3PAUIDirect3D9@@A) ist bereits in ResourceManager.obj definiert.
|
Ich bin völlig ratlos und versuche seit 1 Stunde vergebliches. Die Variable habe ich auch schon in eine eigene Headerdatei mal ausgelagert, die natürlich auch #pragma once hat. Ohne Erfolg.
Ich bin für jeden Ratschlag oder Gedankenanstoß dankbar, und direkte Problemlösungen sind natürlich auch super
Besten Dank im Voraus an jeden Poster!