Omnet++:作为复合模块的子模块调用时未找到 class
Omnet++: class not found when called as a submodule of a compound module
我正在创建一个简单的 omnet++ 模拟。该模拟的一部分使用称为 数据包生成器 的简单模块。它将成为名为 complete 的项目中复合模块的一部分。但是,当我尝试在复合模块中使用 packetGenerator 时,我在尝试 运行 模拟时收到以下错误消息:
Error in module (omnetpp::cModule) net.tx (id=2) during network setup: Class "packetGenerator" not found -- perhaps its code was not linked in, or the class wasn't registered with Register_Class(), or in the case of modules and channels, with Define_Module()/Define_Channel().
是的,我进入了属性--> 项目引用并引用了 packetGenerator 项目(如图所示)。我还调用了 Define_Module(packetGenerator),如 packetGenerator.cc
所示
我推断问题出在复合模块的 submodules 部分,但我不确定如何解决这个问题。任何帮助表示赞赏。如果我省略 packetGenerator 子模块包含在 TransmitterNode 复合模块中,那么模拟将 运行 正常(并且什么也不做,因为还没有功能)。
packetGenerator.cc(项目内部packetGenerator)
#include <stdio.h>
#include <string.h>
#include <omnetpp.h>
#include <AppMessage_m.h>
using namespace omnetpp;
//Simple module responsible for continuously generating AppMessage messages
class packetGenerator: public cSimpleModule {
private:
cMessage* event;
int seqno;
int senderId;
public:
packetGenerator();
virtual ~packetGenerator();
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
virtual AppMessage* generateMessage();
};
Define_Module(packetGenerator);
packetGenerator::packetGenerator() {
event = nullptr;
seqno = 0;
}
packetGenerator::~packetGenerator() {
cancelAndDelete(event);
}
void packetGenerator::initialize() {
senderId = par("nodeIdentifier");
event = new cMessage("event");
scheduleAt(0.0, event);
}
void packetGenerator::handleMessage(cMessage* msg) {
WATCH(seqno);
//Go here when the new message is scheduled to be sent (after the delay)
if (msg == event) {
send(generateMessage(), "out");
simtime_t delay = par("iatDistribution");
scheduleAt(simTime() + delay, event);
}
//If we receive a message that isn't our timer-expiry message (e.g. from the MAC), go here
else {
AppMessage* appmsg = check_and_cast<AppMessage*>(msg);
EV << "Message received" << endl;
EV << "Message kind: " << msg->getKind() << endl;
delete appmsg;
}
}
AppMessage* packetGenerator::generateMessage() {
simtime_t timeStamp = simTime();
int sequenceNumber = seqno;
seqno++;
int msgSize = par("messageSize");
char messageName[30];
sprintf(messageName, "Message from %d", senderId);
AppMessage* msg = new AppMessage(messageName);
msg->setTimeStamp(timeStamp);
msg->setSenderId(senderId);
msg->setSequenceNumber(sequenceNumber);
msg->setMsgSize(msgSize);
return msg;
}
net.ned(项目内部完成)
package complete;
import packetgenerator.packetGenerator;
module TransmitterNode
{
parameters:
int nodeIdentifier; //These need to be unique in the simulation
double nodeXPosition;
double nodeYPosition;
@display("bgb=468,188;i=device/cellphone");
gates:
submodules:
packetGenerator: packetGenerator {
@display("p=79,90;i=block/source");
}
connections:
}
network net
{
submodules:
tx: TransmitterNode;
connections:
}
项目 packetGenerator
必须构建为共享库并选中 Project
中的复选框 Export this shared/static library for other projects
| Properties
| OMNeT++
| Makemake
|选择根目录或 src 目录 | Options...
| Target
.
我遇到了同样的问题。发现包错了,已经解决了。就像您使用 "package complete" 一样,这可能会造成问题。如果您发现像 "complete.linklayer.**" 这样的错误,您可以在错误的 window 中看到,所以可能完整的包需要相应地更改错误中提到的并建议实际需要的包。根据你的问题,我认为你有同样的问题。我只是在谈论我的经历。让我们试一试。
我正在创建一个简单的 omnet++ 模拟。该模拟的一部分使用称为 数据包生成器 的简单模块。它将成为名为 complete 的项目中复合模块的一部分。但是,当我尝试在复合模块中使用 packetGenerator 时,我在尝试 运行 模拟时收到以下错误消息:
Error in module (omnetpp::cModule) net.tx (id=2) during network setup: Class "packetGenerator" not found -- perhaps its code was not linked in, or the class wasn't registered with Register_Class(), or in the case of modules and channels, with Define_Module()/Define_Channel().
是的,我进入了属性--> 项目引用并引用了 packetGenerator 项目(如图所示)。我还调用了 Define_Module(packetGenerator),如 packetGenerator.cc
所示我推断问题出在复合模块的 submodules 部分,但我不确定如何解决这个问题。任何帮助表示赞赏。如果我省略 packetGenerator 子模块包含在 TransmitterNode 复合模块中,那么模拟将 运行 正常(并且什么也不做,因为还没有功能)。
packetGenerator.cc(项目内部packetGenerator)
#include <stdio.h>
#include <string.h>
#include <omnetpp.h>
#include <AppMessage_m.h>
using namespace omnetpp;
//Simple module responsible for continuously generating AppMessage messages
class packetGenerator: public cSimpleModule {
private:
cMessage* event;
int seqno;
int senderId;
public:
packetGenerator();
virtual ~packetGenerator();
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
virtual AppMessage* generateMessage();
};
Define_Module(packetGenerator);
packetGenerator::packetGenerator() {
event = nullptr;
seqno = 0;
}
packetGenerator::~packetGenerator() {
cancelAndDelete(event);
}
void packetGenerator::initialize() {
senderId = par("nodeIdentifier");
event = new cMessage("event");
scheduleAt(0.0, event);
}
void packetGenerator::handleMessage(cMessage* msg) {
WATCH(seqno);
//Go here when the new message is scheduled to be sent (after the delay)
if (msg == event) {
send(generateMessage(), "out");
simtime_t delay = par("iatDistribution");
scheduleAt(simTime() + delay, event);
}
//If we receive a message that isn't our timer-expiry message (e.g. from the MAC), go here
else {
AppMessage* appmsg = check_and_cast<AppMessage*>(msg);
EV << "Message received" << endl;
EV << "Message kind: " << msg->getKind() << endl;
delete appmsg;
}
}
AppMessage* packetGenerator::generateMessage() {
simtime_t timeStamp = simTime();
int sequenceNumber = seqno;
seqno++;
int msgSize = par("messageSize");
char messageName[30];
sprintf(messageName, "Message from %d", senderId);
AppMessage* msg = new AppMessage(messageName);
msg->setTimeStamp(timeStamp);
msg->setSenderId(senderId);
msg->setSequenceNumber(sequenceNumber);
msg->setMsgSize(msgSize);
return msg;
}
net.ned(项目内部完成)
package complete;
import packetgenerator.packetGenerator;
module TransmitterNode
{
parameters:
int nodeIdentifier; //These need to be unique in the simulation
double nodeXPosition;
double nodeYPosition;
@display("bgb=468,188;i=device/cellphone");
gates:
submodules:
packetGenerator: packetGenerator {
@display("p=79,90;i=block/source");
}
connections:
}
network net
{
submodules:
tx: TransmitterNode;
connections:
}
项目 packetGenerator
必须构建为共享库并选中 Project
中的复选框 Export this shared/static library for other projects
| Properties
| OMNeT++
| Makemake
|选择根目录或 src 目录 | Options...
| Target
.
我遇到了同样的问题。发现包错了,已经解决了。就像您使用 "package complete" 一样,这可能会造成问题。如果您发现像 "complete.linklayer.**" 这样的错误,您可以在错误的 window 中看到,所以可能完整的包需要相应地更改错误中提到的并建议实际需要的包。根据你的问题,我认为你有同样的问题。我只是在谈论我的经历。让我们试一试。