Public symbol '...' defined in both module



  • Hallo,

    ich hab folgendes Problem:
    Beim Compilieren einer Sammlung von Steuerelementen die ich programmiert habe
    kommen etliche dieser Warnungen, die ich gerne entfernen möchte:

    [Linker Warnung] Public symbol '_g_CAN_Init' defined in both module CANCARD.OBJ and SGG050.OBJ
    

    ich versteh aber nicht warum die überhaupt kommen. Im Header der CANCARD Klasse
    steht folgendes:

    #ifndef CANCardH
    #define CANCardH
    
    typedef DWORD (__stdcall *PCAN_Init)(WORD wBTR0BTR1, int CANMsgType);
    
    ...
    PCAN_Init g_CAN_Init;
    
    ...
    
    class PACKAGE TCANCard : public TComponent
    {
    ...
    }
    #endif
    

    der Header der Klasse wird auch in SGG050.h eingebunden, dürfte ja aber nicht
    mehr verwendet werden wegen dem "#define CANCardH" oder?



  • Acidmrp schrieb:

    der Header der Klasse wird auch in SGG050.h eingebunden, dürfte ja aber nicht
    mehr verwendet werden wegen dem "#define CANCardH" oder?

    Include-Guards schützen dich nur davor, dass dieselbe Headerdatei nicht mehrfach in eine Übersetzungseinheit (= .cpp-Datei) eingebunden wird.

    Sie können nicht verhindern, dass deine Variable g_CAN_Init in mehrere unterschiedliche Übersetzungseinheiten gelangt. Das passiert in deinem Fall, und darum beschwert sich der Linker (zu Recht). Such mal nach "extern".



  • danke für deine Antwort, dass Problem ist nun klar. Ich hab mir auch etliche
    Beiträge durchgelesen, aber eine Lösung hab ich nicht gefunden.

    Hat mir noch jemand einen Tip? Ich hab ca. 50 Warnungen und will das eigentlich
    nicht so lassen 😞



  • versuch mal folgendes :

    static PCAN_Init g_CAN_Init;
    

    damit hatte das glaubich bei mir mal funktioniert



  • Beliah schrieb:

    damit hatte das glaubich bei mir mal funktioniert

    Wenn du mit "funktionieren" meinst, dass es jetzt ein g_CAN_Init pro Übersetzungseinheit gibt, dann glaubst du richtig. Ich vermute aber, das ist hier nicht beabsichtigt.



  • nein das wäre hier nicht beabsichtigt.

    Das ganze sieht so aus:

    TCANCard ist die Schnittstelle zu verschiedenen CAN Karten (hier Karten
    von Vector und PEAK).

    SGG050 ist der Sensor fürs ESP, damit wird die Drehrate und Beschleunigung
    vom Auto gemessen.

    Die Klasse TSGG050 hat einen Zeiger auf TCANCard.

    g_CAN_Init & co. verwende ich um dynamisch die Treiber dll's der CAN Karten
    zu laden. TSGG050 braucht diese also eigentlich nicht direkt.



  • // im header
    extern "C" PCAN_Init g_CAN_Init;
    
    // in cpp
    PCAN_Init g_CAN_Init;
    

    sollte eigentlich funktionieren, wenns denn globale variablen sein müssen.



  • danke, dass hat mich auf eine Idee gebracht 🙂

    #ifndef CANCardH
    #define CANCardH
    
    typedef DWORD (__stdcall *PCAN_Init)(WORD wBTR0BTR1, int CANMsgType);
    
    class CDynamicCAN
    {
    public:
    PCAN_Init g_CAN_Init;
    ...
    };
    
    class PACKAGE TCANCard : public TComponent
    {
    private:
    CDynamicCAN *DynamicCAN
    ...
    };
    #endif
    

    und so klappt es dann auch wunderbar 🙂


Anmelden zum Antworten