Warning LNK4006 nicht nachvollziehbar.



  • Hallo,

    Ich habe hier eine Warnung, die ich ziemlich merkwürdig finde. Wenn ich das richtig verstehe, sagt der Linker "es gibt da was in Modul A, was bereits in Modul A definiert ist, deshalb wird die zweite Definition in Modul A ignoriert":

    1>CIL library( CIL module) : warning LNK4006: "struct mystruct samplestruct1" (?samplestruct1@@3Umystruct@@A) already defined in  CIL library( CIL module); second definition ignored
    

    Dann damit jemand was anfangen?

    Danke.



  • Hi,

    naja, sieht danach aus, als ob das globale Objekt "samplestruct1" in mehreren Übersetzungseinheiten ("obj-Files") definiert ist. Der Linker geht jetzt davon aus, dass eigentlich nur ein Objekt gemeint war und ignoriert deswegen das zweite.

    Ich tippe auf unglückliches Moduldesign und/oder Linking.

    Gruß,

    Simon2.



  • Ja, so etwas ähnliches ist da gemacht worden. Die Struktur ist in einer Header-Datei definiert und deklariert, und die Header-Datei ist wiederum in mehreren Quellcode-Dateien drin.

    An dem grundlegenden Design kann ich wahrscheinlich nichts mehr ändern, da das Kind bereits vor mehreren Jahren in den Brunnen gefallen ist.

    Ich verstehe eben nicht, warum da an irgend einer ominösen CIL Library (die mir im übrigen nichts sagt) rummeckert.



  • Mal ganz banal (bitte nicht hauen 😉 )

    Aber hast du alle include guards richtig gesetzt?



  • Gast2388 schrieb:

    Ja, so etwas ähnliches ist da gemacht worden. Die Struktur ist in einer Header-Datei definiert und deklariert, und die Header-Datei ist wiederum in mehreren Quellcode-Dateien drin.

    ändere das in der header-datei um in:

    extern struct mystruct samplestruct1;
    

    und in eine .c-datei erzeuge das objekt:

    struct mystruct samplestruct1;
    

    🙂



  • dark-eye schrieb:

    Mal ganz banal (bitte nicht hauen 😉 )

    Aber hast du alle include guards richtig gesetzt?

    Würde aber nichts helfen....

    include-guards schützen gegen Mehrfachdefinitionen beim compile aber nicht gegen solche, die erst beim Link auftauchen (also da, wo mehrere ÜEs zum Tragen kommen).

    Gruß,

    Simon2.



  • fricky schrieb:

    ....
    ändere das in der header-datei um in:

    extern struct mystruct samplestruct1;
    

    und in eine .c-datei erzeuge das objekt:

    struct mystruct samplestruct1;
    

    🙂

    Oder besser gleich in

    extern mystruct samplestruct1;
    mystruct samplestruct1;
    

    (FALLS wir uns hier wirklich in C++ befinden)

    Gruß,

    Simon2.


Anmelden zum Antworten