[VS2013] C++ LINKER versucht Headerfile mehrmals einzubinden trotz #pragma once
-
Hallo,
ich habe eine Headerfile und dort befindet sich oben ein #pragma once und unten drunter folgen 2 Klassen und 2 Struct's.
/** * GTA API by Slider (c) www.gta-api.de * * @author Slider * @date 2014-08-25 * @copyright (c) by Slider - www.gta-api.de * @license General Public License <https://www.gnu.org/licenses/gpl> * * this class contains all informations about the cityies & zones in GTA SA */ #pragma once #define MAX_CITYNAME_LENGTH 20 #define MAX_ZONENAME_LENGTH 40 #define MAX_CITIES 10 #define MAX_ZONES 377 // citys struct GTACities { char _cityname[MAX_CITYNAME_LENGTH]; double _cityX1; double _cityY1; double _cityZ1; double _cityX2; double _cityY2; double _cityZ2; int _cityused; }; struct GTACities __cities[MAX_CITIES]; // zones struct GTAZones { char _zonename[MAX_ZONENAME_LENGTH]; double _zoneX1; double _zoneY1; double _zoneZ1; double _zoneX2; double _zoneY2; double _zoneZ2; int _zoneused; }; struct GTAZones __zones[MAX_ZONES]; class Cities { public: void LoadCities(); void AddCity(char*, double, double, double, double, double, double); }; class Zones { public: void LoadZones(); void AddZone(char*, double, double, double, double, double, double); };
Die Headerdatei wird von mehreren CPP Dateien verwendet und komischerweise bekomme ich folgende Errors:
1>------ Erstellen gestartet: Projekt: API, Konfiguration: Release Win32 ------ 1> API.cpp 1> GTASA.cpp 1>GTASA.obj : error LNK2005: "struct GTAZones * __zones" (?__zones@@3PAUGTAZones@@A) ist bereits in API.obj definiert. 1>GTASA.obj : error LNK2005: "struct GTACities * __cities" (?__cities@@3PAUGTACities@@A) ist bereits in API.obj definiert. 1>Areas.obj : error LNK2005: "struct GTAZones * __zones" (?__zones@@3PAUGTAZones@@A) ist bereits in API.obj definiert. 1>Areas.obj : error LNK2005: "struct GTACities * __cities" (?__cities@@3PAUGTACities@@A) ist bereits in API.obj definiert. 1> Bibliothek "C:\Users\xxx\Documents\Visual Studio 2013\Projects\API\Release\API.lib" und Objekt "C:\Users\xxx\Documents\Visual Studio 2013\Projects\API\Release\API.exp" werden erstellt. 1>C:\Users\xxx\Documents\Visual Studio 2013\Projects\API\Release\API.dll : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden. ========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========
Hat jemand eine Idee, an was das liegt?
-
C++ LINKER versucht Headerfile mehrmals einzubinden trotz #pragma once
Der Linker bindet mehrere *.cpp-Dateien ein. Das ist gut und das soll er so machen.
Jede dieser *.cpp bindet Deine *.h ein, aber wegen #pragma once nur einmal pro *.cpp.
Im Endeffekt sieht der Linker die *.h dann doch doppelt.Desdawegen musst Du Definitionen da raus tun. Zum Beispiel extern davorschreiben (eine Deklaration draus machen, die darf der Linker doppelt sehen= und die Definition in die passende *.cpp stecken, denn der Linker sieht jede *.cpp nur einmal, dann klappts.