【问题标题】:OMNeT++: Error in module during network setup: Class not foundOMNeT++:网络设置期间模块出错:找不到类
【发布时间】:2015-07-08 12:38:59
【问题描述】:

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

我想改变我的问题 - 有没有一种简单的方法可以创建一个类似于静脉的 RSUExampleScenario 的项目,而不是在静脉/示例/我的文件夹下,而是在单独的项目和工作区中?我必须为此采取哪些步骤?

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

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

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

网络设置期间模块 (cCompoundModule) CloudVehicleScenarioMessage (id=1) 出错:找不到类“Connection”——可能其代码未链接,或者该类未使用 Register_Class() 注册,或者在模块和通道的情况下,使用 Define_Module()/Define_Channel()。

我猜NED文件已经加载了,但是找不到c++文件中的类,虽然我使用了Define_Module。 Cloud 只是一个复合模块,没有任何自己的 c++ 实现,它不会产生任何问题。 Connection 是一个简单的模块,引用类 Connection.cc,其中调用了 Define_Module() 并在加载时导致错误。 我的所有文件夹,如 nodeconnection 都包括在内,我可以在 Project->Properties->Paths and Symbols->Includes 下看到。

我已经尝试重建 OMNeT++(如 https://www.linkedin.com/grp/post/3801609-234767834 所述)并为我的类定义命名空间(如 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);
}

类连接,找不到:

连接/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){
}

连接.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_ */

【问题讨论】:

    标签: eclipse-cdt omnet++


    【解决方案1】:

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

    【讨论】:

    • 你的项目建好了吗?如果没有,请转到 ProjectBuild Project
    • 让我们检查两件事:1)去运行|运行配置...,选择您的配置并告诉我选中了哪个选项:“opp_run”或“其他”; 2) 转到项目 |属性 | OMNet++ | Makemake,在包含您的源代码的树选择文件夹中,然后选项... |目标并告诉我选择了哪种类型的目标(可执行或共享库)。
    • 我在运行配置中选择了 op_run,否则我将不得不选择一个可执行文件。但是我想在我的项目中进行不同的模拟,并且主文件夹 CloudBasedCSW.exe 中只有一个可执行文件。据我了解,我需要 op_run 和 run.sh (#!/bin/sh ../../run "$@") 来运行我的模拟,就像静脉 RSUExampleScenario 一样。目标类型是可执行的。是假的吗?
    • 还有一条评论,我在主项目 CloudBasedCSW 的 makemake 中寻找目标类型。它包括我的模拟“cloudvehiclehi”文件夹,其中包含omnetpp、run.sh等,是运行配置。但是“cloudvehiclehi”没有makemake。
    • 在 OMNeT++ 中有两种准备模型的方法:作为可执行文件或作为库(例如 dll)。为了执行作为库准备的模型,已经制作了 opp_run 工具,因为 dll 文件无法独立启动。在您的情况下,目标类型可执行文件意味着编译后的代码进入 CloudBasedCSW.exe。但是 opp_run 不使用可执行文件。这就解释了为什么您的模拟看不到已编译的类 Connection。所以我建议:将目标保留为可执行并将运行配置更改为“其他”并选择CloudBasedCSW.exe
    【解决方案2】:

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

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

    1. 创建 omnet++ 项目 myproject 文件->new->OMNeT 项目->带有“src”和“simulations”文件夹的空项目
    2. 必须将静脉导入工作区才能使用它:导入-> 现有项目到工作区->
    3. 将静脉添加到项目->属性->项目引用
    4. 将 .ned 和 c++/h 文件放在文件夹 src 中
    5. 将 omnetpp.ini 和所有 sumo 配置文件放在文件夹 simulations 中
    6. 使用工作目录 myproject/simulations 和 Simulation->Executable->其他:使用 /myproject/src/myproject 中的 exe 文件创建运行配置模拟

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

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

    【讨论】:

    • 广告命名空间:在 .ned 文件中使用 @namespace() 可能会解决此问题
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      相关资源
      最近更新 更多