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.OBJich 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 { ... } #endifder 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 ... }; #endifund so klappt es dann auch wunderbar
