Probleme mit Mehrfachdeklaration beim Linken



  • Morgen,

    ich hab ein kleines Problem, vielleicht habt ihr ja ein paar Vorschläge die mich näher an die Lösung bringen 😉 :

    Meine c++ Dateien werden seperat kompiliert und danach vom Linker zusammengefügt.

    Das Problem daran ist, das ich in einigen Dateien die gleichen Header benutzen muss. Dadurch erhalte ich vom Linker den Hinweis der Mehrfachdeklaration.

    Ich kann die Header aber auch nicht aus den Dateien nehmen, da diese sonst nicht über den Compiler hinaus kommen.

    Das einzige was mir jetzt eingefallen ist, ist alle Dateien über den Mainheader einzubinden und nur meine main.cpp zu kompilieren. Dadürch hatte ich nur noch ein object file und der Linker sollte nicht mehr meckern.

    Allerdings kann ich mir nich vorstellen das es dafür nicht eine elegantere lösung gibt...

    P.S alle header sind nach folgendem Schema aufgebaut

    [cpp]#ifndef [i]headerfilename[/i]
    #define [i]headerfilename[/i]
     //code
    #endif[/cpp]
    


  • Wenn, dann erhälst Du Fehler zu Mehrfachdefinitionen 😉

    Lösung:
    Definitionen inline machen (je nach Funktion weniger gut) oder sauber in ein eigenes cpp File packen und aus dem Header entfernen.



  • Oh ja sorry - natürlich Definitionen 😉

    Aber bei inline Definitionen würde ich doch ebenfalls auf das gleiche Problem stoßen.

    Das Problem ist ja nicht das Kompilieren, sondern das nachher zusammenfügen.



  • So nach einigen Studien bin ich zu folgendem Schluss gelangt:

    Der Kompiler läuft einwandfrei durch und erzeugt die entsprechenden object Dateien.

    In den Objectdateien gibt es jeweils diese Definition, was zu Problemen beim linken führt.

    Die Möglichkeit per c&p die betroffenen Datein zusammenzufassen funktioniert zwar, ist für mich aber keine wirkliche Alternative.

    Daher frage ich mich ob es nicht eine Möglichkeit gibt, dem Kompiler zu sagen das er mehrere Dateien zusammen kompilieren soll, so dass dieser nur ein object Datei erzeugt.



  • Die (einzigen) Lösungen wurden Dir schon genannt:

    Inlining oder Auslagern der Definitionen in jeweils eine CPP-Datei.

    Warum sträubst Du Dich dagegen?



  • Usual solution:

    //var.h (header)
    extern int var; // declaration
    
    // var.cpp (special .cpp file where you define variable)
    int var; // definition
    
    // main.cpp
    int x = var; // you can use var
    
    // other_module.cpp
    int y = var;
    var = 10; // you can use var, it's the same variable
    

    Note that it's more C solution. You can also create singleton.



  • Vielen dank,

    es funktioniert jetzt. Ich musste dann doch die Headerdatei vom Hersteller anpacken, naja was solls 😉

    Ich hab jetzt aber noch ein anderes Problem mit COM.

    Ich will mit CoCreateInstance eine Instanz erzeugen, doch leider weiss ich nicht wie ich die CLSID übergeben soll bzw. wie ich die CLSID definieren soll.

    P.S bin totaler neuling mit dem COM.



  • kuerbis schrieb:

    Vielen dank,

    es funktioniert jetzt. Ich musste dann doch die Headerdatei vom Hersteller anpacken, naja was solls 😉

    also in dem fall wuerde ich die headerdateien vom hersteller nicht anruehren.
    schreib lieber eine wrapper-klasse, die im implementationsfile die betroffene headerdatei inkludiert.
    somit wird das header file nur mehr einmal inkludiert und du bekommst keine linker-error mehr.
    das waere meiner meinung nach eine wesentlich elegantere loesung.

    - georg


Anmelden zum Antworten