Immer diese Linker Fehler...



  • Hallooo,

    Bisher habe ich es eigentlich immer geschafft jeden Linker Fehler spätestens nach ca. 1 Stunde zu lösen. Jetzt bin ich auf einen gestoßen, den ich in der Form noch nicht kenne und ich weiß absolut nimmer weiter =/... aber vielleicht könnt ihr mir ja helfen :>

    Ich benutze VC++ 2008.

    In einer meiner Header includiere ich den Header <rmxftmpl.h>. Dieser Header enthält nur eine Definition und zwar ein Direct 3D Template, das sieht ungefähr wie folgt aus:

    //<rmxftmpl.h>
    /* D3DRM XFile templates in binary form */
    
    #ifndef _RMXFTMPL_H_
    #define _RMXFTMPL_H_
    
    unsigned char D3DRM_XTEMPLATES[] = {
    	0x78, 0x6f, 0x66, 0x20, 0x30, 0x33, 0x30, 0x32, 0x62, 
    	0x69, 0x6e, 0x20, 0x30, 0x30, 0x36, 0x34, 0x1f, 0, 0x1, 
               //Hier folgen noch einige weitere binaries...
    	0, 0, 0, 0x62, 0x52, 0x69, 0x67, 0x68, 0x74, 0x48, 
    	0x61, 0x6e, 0x64, 0x65, 0x64, 0x14, 0, 0xb, 0
    };
    
    #define D3DRM_XTEMPLATE_BYTES 3278
    
    #endif /* _RMXFTMPL_H_ */
    

    Das ist alles was in dem Header drin steht.

    Mein "#include <rmxftmpl.h>" steht in der Datei "Model.h":

    //"Model.h"
    
    #pragma once
    
    #pragma comment (lib, "dxguid.lib")
    #pragma comment (lib, "d3dxof.lib")
    
    #include <rmxftmpl.h>   //<----------Da steht's!!!
    #include <d3dx9.h>
    #include <dxfile.h>
    #include <rmxfguid.h>
    #include <stdio.h>
    #include "Protokoll.h"
    
    //Definitionen, Typdefinitionen und die Klasse Model
    

    Dieses Template aus der Header Datei benutze ich nur innerhalb der cpp-Datei in einer Methode:

    "Model.cpp"
    
    BOOL Model::ladeDatei([...])
    {
        [...]
    	pDXFile->RegisterTemplates((LPVOID)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES);
        [...]
    }
    

    Diesen Header, also "Model.h" includiere ich ebenfalls nur in einer Datei, diese Datei heißt "Main.h" und ist die, in der auch die WinMain(...) Funktion drin steht.

    "Main.h"
    #pragma once
    
    #pragma comment (lib, "d3d9.lib")
    #pragma comment (lib, "d3dx9.lib")
    
    #include <windows.h>
    #include <d3dx9.h>
    #include "ZweiDGrafik.h"
    #include "Model.h"
    
    //....
    

    In der Hierarchie sieht das also in etwa so aus:
    "Main.h" includiert "Model.h"
    "Model.h" includiert <rmxftmpl.h>

    Die Header "Model.h" und <rmxftmpl.h> werden sonst nirgendwo anders includiert!

    Nun zum Fehler:

    Trotzdem, dass dem Compiler die Datei <rmxftmpl.h> nur einmal unter die Nase geschoben wird und er außerdem noch einen include-guard hat, wie man oben schön sehen kann (genau wie alle meine Header), findet er scheinbar irgendwo eine redefinition dieses "binary templates":

    1>Model.obj : error LNK2005: "unsigned char * D3DRM_XTEMPLATES" (?D3DRM_XTEMPLATES@@3PAEA) ist bereits in Main.obj definiert.
    1>E:\Projekte\cplusplus\Rahmenprogramm\Debug\Rahmenprogramm2.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
    

    Was mache ich falsch??

    Danke schonmal für jede Hilfe.



  • Hmm.. Ich habs jetzt so gelößt, dass ich das #include <rmxftmpl.h> in die .cpp Datei gepackt habe.. Aber für mich ist das nur eine vorübergehende Lösung... Des kann doch ned sein, dass der da Meckert?

    Wenn jemand ne andere Lösung dafür hat.. Ich bin da für alles offen^^

    Danke



  • Hallo,

    der include-guard schützt dich nicht vor doppelten Definitionen, wenn die gleiche Datei (hier rmxftmpl.h) in unterschiedlichen .cpp-Dateien eingebunden wird. Hier:

    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=ODR#Answ

    wird es erklärt. Du benötigst extern in der .h-Datei, die in anderen .cpp-Dateien verwendet werden soll, und die Definition des D3DRM_XTEMPLATES muss in der (in genau einer!) .cpp-Datei erfolgen.

    MfG,

    Probe-Nutzer



  • Die einfachste und wohl auch beste Lösung (falls möglich): D3DRM_XTEMPLATES als extern im Header, Definition in einer .cpp Datei.

    Die Model.h scheint aber mehrfach eingebunden zu werden (direkt oder indirekt).
    Der include guard schützt ja nur vor dem mehrfachen einbinden beim Compilieren einer .cpp. Es kann dir aber passieren, dass mehrere .cpp Dateien den Header einbinden und dann hast du die Definition in 2 Objekt Dateien. Beim Linken gibts dann den Fehler.



  • Sehr aufschlussreich 🙂

    Ich danke sehr.

    Mit dem Befehl extern kann ich leider immer noch nich viel anfangen, aber das is ne andere sache^^


Anmelden zum Antworten