Linkerfehler 2019 oder 2005 - kanns mir aussuchen
-
Hallo!
Ich hab ein Problem mit meinem Linker.
Also beim linken meiner compilierten Datei mit der Datei des Frameworks bekomme ich den garstigen und gut bekannten LNK2019: unresolved external symbol Fehler.C:\INET-20061020\Examples\...\Test_simp01>link.exe /nologo /dll /subsystem:console /opt:noref EtherApp_m.obj Ether2App.obj ../../../bin/INET.lib /out:Test_simp01.dll Ether2App.obj : error LNK2019: unresolved external symbol "public: __thiscall Ieee802Ctrl::Ieee802Ct rl(void)" (??0Ieee802Ctrl@@QAE@XZ) referenced in function "protected: void __thiscall Ether2App::sen dPacket(void)" (?sendPacket@Ether2App@@IAEXXZ)Sobald ich ihm aber die Datei angebe, in der der angeblich fehlende Konstruktor zu finden ist, bekomme ich einen LNK2005 already defined in Fehler.
C:\INET-20061020\Examples\...\Test_simp01>link.exe /nologo /dll /subsystem:console /opt:noref ../ ../../NetworkInterfaces/Contract/Ieee802Ctrl_m.obj EtherApp_m.obj Ether2App.obj ../../../bin/INET.li b /out:Test_simp01.dll INET.lib(INET.exe) : error LNK2005: "public: __thiscall cStructDescriptor::cStructDescriptor(class c StructDescriptor const &)" (??0cStructDescriptor@@QAE@ABV0@@Z) already defined in Ieee802Ctrl_m.objEigentlich sollte ich mir die extra Angabe der besagten Datei sparren können, da alles in der INET.lib vorhanden sein sollte(aber irgendwie findet er den Konstruktor nicht.
). Ohne Angabe dieser Datei (Ieee802Ctrl_m.obj) bekomme ich eben den LNK2019, mit Angabe dieser Datei den LNK2005.Weiß jemand Rat, was ich da tun könnte?
Hier noch ein Bild vom bin Ordner (dort wo sich die lib befindet)
-
Also der zweite Fehler klingt für mich sehr nach fehlenden Includeguards.
Aber ohne Code wird das nur ein Ratespiel.

-
Oder eine Funktion, die in einem Header außerhalb der Klasse definiert wurde kein inline Keyword gegeben.
-
Hallo!
Hier der IEEE802CTRL Header:
#ifndef _IEEE802CTRL_M_H_ #define _IEEE802CTRL_M_H_ #include <omnetpp.h> // opp_msgc version check #define MSGC_VERSION 0x0303 #if (MSGC_VERSION!=OMNETPP_VERSION) # error Version mismatch! Probably this file was generated by an earlier version of opp_msgc: 'make clean' should help. #endif // cplusplus {{ ... }} section: #include "MACAddress.h" // end cplusplus enum Ieee802MessageKind { IEEE802CTRL_DATA = 2003, IEEE802CTRL_REGISTER_DSAP = 2004, IEEE802CTRL_DEREGISTER_DSAP = 2005, IEEE802CTRL_SENDPAUSE = 2006 }; enum SAPCode { SAP_IBM_SNA = 0x04, SAP_IP = 0x06, SAP_3COM = 0x80, SAP_SNAP = 0xAA, SAP_BANYAN = 0xBC, SAP_NOVELL_IPX = 0xE0, SAP_LAN_MANAGER = 0xF4, SAP_CLNS = 0xFE }; enum EtherType { ETHERTYPE_IP = 0x0800, ETHERTYPE_ARP = 0x0806, ETHERTYPE_RARP = 0x8035 }; class Ieee802Ctrl : public cPolymorphic { protected: MACAddress src_var; MACAddress dest_var; int etherType_var; int ssap_var; int dsap_var; int pauseUnits_var; int inputPort_var; // protected and unimplemented operator==(), to prevent accidental usage bool operator==(const Ieee802Ctrl&); public: Ieee802Ctrl(); Ieee802Ctrl(const Ieee802Ctrl& other); virtual ~Ieee802Ctrl(); Ieee802Ctrl& operator=(const Ieee802Ctrl& other); virtual void netPack(cCommBuffer *b); virtual void netUnpack(cCommBuffer *b); // field getter/setter methods virtual MACAddress& getSrc(); virtual const MACAddress& getSrc() const {return const_cast<Ieee802Ctrl*>(this)->getSrc();} virtual void setSrc(const MACAddress& src_var); virtual MACAddress& getDest(); virtual const MACAddress& getDest() const {return const_cast<Ieee802Ctrl*>(this)->getDest();} virtual void setDest(const MACAddress& dest_var); virtual int getEtherType() const; virtual void setEtherType(int etherType_var); virtual int getSsap() const; virtual void setSsap(int ssap_var); virtual int getDsap() const; virtual void setDsap(int dsap_var); virtual int getPauseUnits() const; virtual void setPauseUnits(int pauseUnits_var); virtual int getInputPort() const; virtual void setInputPort(int inputPort_var); }; inline void doPacking(cCommBuffer *b, Ieee802Ctrl& obj) {obj.netPack(b);} inline void doUnpacking(cCommBuffer *b, Ieee802Ctrl& obj) {obj.netUnpack(b);} #endif // _IEEE802CTRL_M_H_und hier mein Header:
#ifndef __ETHER2APP_H__ #define __ETHER2APP_H__ #include <stdio.h> #include <string.h> #include <math.h> #include <omnetpp.h> #include "INETDefs.h" #include "Ieee802Ctrl_m.h" #include "EtherApp_m.h" #include "utils.h" class Ether2App : public cSimpleModule { // send parameters long seqNum; cPar *waitTime; int EtherType; MACAddress destMACAddress; // receive statistics long packetsSent; long packetsReceived; cOutVector eedVector; cStdDev eedStats; protected: virtual void initialize(int stage); virtual int numInitStages() const {return 2;} virtual void handleMessage(cMessage *msg); virtual void finish(); MACAddress resolveDestMACAddress(); void sendPacket(); void receivePacket(cMessage *msg); }; #endifHoffentlich seht ihr wo mein Problem liegt, bin selber scheinbar nicht fähig dazu das Problem zu lösen.
Lg THE_ONE
-
Die Funktion, deren Defintion im ersten Fall fehlt, ist der Defaut-Konstruktor von Ieee802Ctrl. Im zweiten Fall ist eine andere Funktion doppelt definiert, nämlich der Copy-Konstruktor von cStructDescriptor. Diese zweite Definition musst du entfernen (vermutlich aus der Quelle von Ieee802Ctrl_m).
Ganz nebenbei gesagt, die const-Overloads von
Ieee802Ctrl::getSrc()
und
Ieee802Ctrl::getDest()
sind ein bisschen fragwürdig. Soll der Zusammenhang zischen const und Nonconst-Version immer so bestehen, so dürfte eigentlich nur eine dieser beiden Funktionen virtuell sein und die non-const Version müsste die konstante Version aufrufen, nicht umgekehrt (dann Redeklaration der non-const-Version in abgeleiteten Klassen per using nicht vergesen).
-
Hier ein Auszug der Ieee802Ctrl.cc Datei.
class Ieee802CtrlDescriptor : public cStructDescriptor { public: Ieee802CtrlDescriptor(); virtual ~Ieee802CtrlDescriptor(); Ieee802CtrlDescriptor& operator=(const Ieee802CtrlDescriptor& other); virtual cPolymorphic *dup() const {return new Ieee802CtrlDescriptor(*this);} virtual int getFieldCount(); virtual const char *getFieldName(int field); virtual int getFieldType(int field); virtual const char *getFieldTypeString(int field); virtual const char *getFieldEnumName(int field); virtual int getArraySize(int field); virtual bool getFieldAsString(int field, int i, char *resultbuf, int bufsize); virtual bool setFieldAsString(int field, int i, const char *value); virtual const char *getFieldStructName(int field); virtual void *getFieldStructPointer(int field, int i); virtual sFieldWrapper *getFieldWrapper(int field, int i); }; Register_Class(Ieee802CtrlDescriptor); Ieee802CtrlDescriptor::Ieee802CtrlDescriptor() : cStructDescriptor("cPolymorphic") { }Das sind die Stellen aus dem File wo der String cStructDescriptor vorkommt. Was soll ich da jetzt rauslöschen? Außerdem würde ich das nur ungern tun da das ein Datei aus dem Framework ist.