[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.


Anmelden zum Antworten