OMNeT++:网络设置期间模块出错:Class 未找到

OMNeT++: Error in module during network setup: Class not found

我创建了我的第一个 OMNeT++/veins 项目,但无法启动模拟。 你能帮帮我吗?

我想换个问题-有没有一种简单的方法可以创建一个项目,类似于静脉的RSUExampleScenario,不在veins/examples/myfolder下,而是在单独的项目和工作区中?我必须执行哪些步骤?

我想从 veins 创建一个类似于 RSUExampleScenario 的项目,但使用其他场景并使用其他 OMNeT++ 模块。当我在 veins/examples/myfolder 下创建我的项目并将我的新 .ned 文件放在 veins 结构下时,它运行良好。

现在我创建了新项目,包括带有 .ned 和 c++/h 文件的文件夹,例如文件夹 connection (Connection.ned, Connection.cc, Connection.h, package.ned) 和文件夹 node (CloudVehicleScenarioMessage.ned, Cloud.ned) 和模拟文件夹 cloudvehiclehi (omnetpp.ini).

当我开始模拟时收到错误:

网络设置期间模块 (cCompoundModule) CloudVehicleScenarioMessage (id=1) 错误:Class "Connection" 未找到 - 可能未链接其代码,或者class 未在 Register_Class() 中注册,或者在模块和频道的情况下,在 Define_Module()/Define_Channel() 中注册。

我猜是加载了NED文件,但是找不到c++文件中的classes,尽管我使用了Define_Module。 Cloud 只是一个复合模块,没有任何自己的 c++ 实现,它不会产生任何问题。 Connection是一个简单的模块,参考class Connection.cc,其中调用了Define_Module()导致加载时出错。 我所有的文件夹,如 nodeconnection 都包括在内,正如我在 Project->Properties->Paths and Symbols 下看到的->包括.

我已经尝试重建 OMNeT++(如此处所述 https://www.linkedin.com/grp/post/3801609-234767834) and to define namespaces for my classes (as told here Problem in defining a module in omnetpp),但没有帮助。

我证明了我的 makefile 和文件夹已链接(如此处所述https://groups.google.com/forum/#!topic/omnetpp/Cl48hVgkbQ0)。

CloudVehicleScenarioMessage.ned 是我在 omnetpp.ini 的网络。

nodes/CloudVehicleScenarioMessage.ned:

package cloudbasedcsw.nodes;

import cloudbasedcsw.nodes.ScenarioMobility;
import cloudbasedcsw.nodes.Cloud;
import cloudbasedcsw.connection.Connection;

network CloudVehicleScenarioMessage extends ScenarioMobility
{
@display("bgb=540,555");
submodules:
    cloud[1]: Cloud {
        @display("p=150,140;b=10,10,oval");
    }
    con: Connection {
        @display("p=200,40;b=10,10,oval");
    }
}

模块连接的ned文件:

connection/Connection.ned

package cloudbasedcsw.connection;

simple Connection{
    @class(CloudBasedCSW::Connection);
}

Class连接,找不到:

connection/Connection.cc

#include <Connection.h>
#include <VehicleListener.h>
#include <iostream>
using CloudBasedCSW::Connection;

Define_Module(CloudBasedCSW::Connection);

void Connection::initialize(int stage){

}

void Connection::connectToCloud(cModule* node){
}

void Connection::disconnectFromCloud(cModule* node){
}

Connection.h

#ifndef CONNECTION_H_
#define CONNECTION_H_
#include <omnetpp.h>

namespace CloudBasedCSW{

class Connection: public cSimpleModule{
public:
    cModule* scenario;
    void connectToCloud(cModule* node);
    void disconnectFromCloud(cModule* node);
protected:
    virtual void initialize(int stage);
private:
    cModule* cloud;
    int currentId;
    int gateCloudInId;
    int gateCloudOutId;
};

}
#endif /* CONNECTION_H_ */

我猜你的 class ConnectionCloudBasedCSW C++ 命名空间中。因此,在 Connection.ned 中,您应该将 @class(Connection); 更改为 @class(CloudBasedCSW::Connection);

我设法创建了一个新项目并 运行 它,没有出现这个错误。所以,我将分享我的教程。

如何创建使用静脉的 OMNeT++ 项目。

  1. 创建 omnet++ 项目 myproject File->new->OMNeT project->Empty project with 'src' and 'simulations' folders
  2. 必须将 Veins 导入工作区才能使用它:导入-> 现有项目进入工作区->
  3. 在项目->属性->项目引用中添加脉络
  4. 将您的 .ned 和 c++/h 文件放入文件夹 src
  5. 将 omnetpp.ini 和所有 sumo 配置文件放入文件夹 simulations
  6. 创建运行配置模拟,工作目录myproject/simulations和Simulation->Executable->Other:使用来自/myproject/src/myproject
  7. 的exe文件

备注:不要在你的c++文件中使用命名空间,对应.ned文件,因为在c++文件中的classes将找不到( 网络设置期间模块 (cCompoundModule) CloudVehicleScenarioMessage (id=1) 出错:Class "vehicle" 未找到 )。

例如,您有 vehicle.ned 和 vehicle.cc。 vehicle.cc 包括一个 class mynamespace::vehicle。 vehicle.ned 不知道 vehicle 位于命名空间 mynamespace 下。只有通过@class(mynamespace::vehicle)在ned文件中定义了一个class,才能找到

更正此错误的一种简单方法是将 .cc 或所有 c++ 文件复制到 veins/src/ 文件夹中。使用这种技术,您的编译器可以识别您 class.