2016-07-15 40 views
1

当我尝试从inet扩展一个简单的模块时,出现很多类似“重新声明”和“类未注册”的错误。是否有可能在inet.src目录之外扩展模块?如何从inet扩展一个简单的模块?

MyMac.ned

package myproject.linklayer; 

import inet.linklayer.contract.IMACProtocol; 
import inet.linklayer.base.MACProtocolBase; 

simple MyMac extends MACProtocolBase like IMACProtocol 
{ 
    parameters: 
     @display("i=block/rxtx"); 
     @class(MyMac); 
} 

MyMac.h

#ifndef __INET_MYMAC_H 
#define __INET_MYMAC_H 

#include "inet/linklayer/base/MACProtocolBase.h" 
#include "inet/linklayer/contract/IMACProtocol.h" 

using namespace inet; 

namespace inet { } // namespace inet 

class INET_API MyMac : public MACProtocolBase, public IMACProtocol 
{ 
    public: 
     MyMac(); 
     virtual ~MyMac(); 

     virtual void initialize(int stage) override; 
}; 

#endif /* __INET_MYMAC_H */ 

MyMac.cc

#include "MyMac.h" 

using namespace inet; 

namespace inet {} // namespace inet 

Define_Module(MyMac); 

MyMac::MyMac() {} 

MyMac::~MyMac() {} 

void MyMac::initialize(int stage) 
{ 
    MACProtocolBase::initialize(stage); 
} 

回答

0

是的,这是可能的外界INET目录编制项目。你应该:

  1. 创建一个新的OMNeT++项目,然后进入其属性,并选择inet项目作为Project References
  2. 将您的文件MyMac.ned,MyMac.hMyMac.cc转移到新项目中。
  3. 修改您的C++文件:代码必须是命名空间inet,所有继承的纯虚方法在你的代码重写,INET_API可以被移除。
  4. NED文件中为C++类添加一个名称空间。

更正代码:
MyMac.h:

#ifndef __INET_MYMAC_H 
#define __INET_MYMAC_H 

#include "inet/linklayer/base/MACProtocolBase.h" 
#include "inet/linklayer/contract/IMACProtocol.h" 
namespace inet { 

class MyMac : public MACProtocolBase, public IMACProtocol 
{ 
    public: 
     MyMac(); 
     virtual ~MyMac(); 
     virtual void initialize(int stage) override; 
    protected: 
     virtual void handleUpperPacket(cPacket *packet) override ; 
     virtual void handleLowerPacket(cPacket *packet) override; 
     virtual bool isUpperMessage(cMessage *message) override; 
     virtual bool isLowerMessage(cMessage *message) override ; 
     virtual InterfaceEntry *createInterfaceEntry() override; 
}; 
} // namespace inet 
#endif /* __INET_MYMAC_H */ 

MyMac.cc:

#include "MyMac.h" 
namespace inet { 

Define_Module(MyMac); 
MyMac::MyMac() { 
} 

MyMac::~MyMac() { 
} 

void MyMac::initialize(int stage) { 
    MACProtocolBase::initialize(stage); 
} 

void MyMac::handleUpperPacket(cPacket *packet) { 

} 
void MyMac::handleLowerPacket(cPacket *packet) { 
} 

bool MyMac::isUpperMessage(cMessage *message) { 
} 

bool MyMac::isLowerMessage(cMessage *message) { 
} 

InterfaceEntry *MyMac::createInterfaceEntry() { 
} 

} // namespace inet 

MyMac.ned:

package myproject.linklayer; 

import inet.linklayer.contract.IMACProtocol; 
import inet.linklayer.base.MACProtocolBase; 

simple MyMac extends MACProtocolBase like IMACProtocol 
{ 
    parameters: 
     @display("i=block/rxtx"); 
     @class(inet::MyMac); 
} 
+0

感谢。在MyMac.cc中,我仍然得到2个错误: Define_Module(MyMac); //未定义对'_imp___ZTIN4inet5MyMacE'的引用“” MyMac :: MyMac(){//'inet :: MyMac :: MyMac'重新声明时没有'dllimport'属性:之前的'dllimport'被忽略[-Winconsistent-dllimport]和未定义的引用'_imp___ZTVN4inet5MyMacE' –

+0

从类声明中删除'INET_API',并在'NED'文件中的一个类中添加一个名称空间,然后清理并重建你的项目,我已经更新了我的答案。 –