Omnet++ C++链接报错:Define_Module(OLT)未定义引用构造函数
问题现象
构建OMNeT++项目时,Define_Module(OLT)位置抛出链接错误,错误信息如下:
D:\omnetpp-4.6\ptixiaki\XGPON/OLT.cc:18: undefined reference to `OLT::OLT()'
collect2.exe: error: ld returned 1 exit status
Makefile:94: recipe for target 'out/gcc-debug//XGPON.exe' failed
make: *** [out/gcc-debug//XGPON.exe] Error 1
错误根因
该错误和Define_Module宏本身无关。你在OLT.h头文件的类定义中,手动声明了类的构造函数OLT()和析构函数virtual ~OLT(),但没有在OLT.cc中编写这两个函数的实现代码。链接阶段生成模块实例需要调用构造函数时,找不到对应的函数实现,就会抛出undefined reference错误。
修复方法
二选一即可:
- 无自定义构造/析构逻辑时,直接删除
OLT.h中public块下的构造、析构声明,编译器会自动生成默认的构造和析构函数:public : // 删除以下两行手动声明 // OLT(); // virtual ~OLT(); - 需要后续在构造、析构中添加自定义初始化/资源释放逻辑时,在
OLT.cc中补全两个函数的实现,放在Define_Module(OLT);之后即可:Define_Module(OLT); OLT::OLT() { // 自定义成员初始化逻辑,无需求可留空 } OLT::~OLT() { // 自定义资源释放逻辑,无需求可留空 }
其他潜在代码问题
修完上述链接错误后,你现有代码还存在以下会触发编译/运行异常的问题,需要同步修正:
- 成员变量遮蔽:
initialize()函数中cPacketQueue* OLTBuffer = new cPacketQueue("OLTBuffer");会定义和类成员同名的局部变量,类成员指针不会被赋值,后续访问会触发空指针崩溃。修改为直接给类成员赋值:// 错误写法 // cPacketQueue* OLTBuffer = new cPacketQueue("OLTBuffer"); // 正确写法 OLTBuffer = new cPacketQueue("OLTBuffer"); - 门名称不匹配:NED文件中定义的OLT门为
splitter_to_OLT(输入)、OLT_to_splitter(输出),但forwardFrame()函数中调用gateSize("out")、send(msg, "out"),不存在名为out的门,运行时会直接报错,需要统一门名称。 - 运算逻辑错误:RTT计算行
RTT.push_back(distance.at(i) / 3*(10^8));存在两个问题:C++中^是按位异或运算符,不是幂运算,计算10的8次方需要用pow(10,8)或直接写常量100000000;同时乘除为同优先级运算符,当前写法会先算距离除以3再乘1e8,不符合光速计算逻辑,需要给分母加括号:// 修正后写法 RTT.push_back(distance.at(i) / (3 * pow(10, 8))); - 非法析构调用:
generateFrame()中queue->~DownFrame();属于手动调用对象析构函数,会导致后续对象生命周期结束时重复释放内存触发崩溃,这行直接删除,对象使用完成后调用delete queue;释放即可。 - 拓扑连接错误:NED文件中仅实例化1个ONU,却使用了向量门的动态连接语法,同时
splitter.splitter_OLT --> downstream --> onu.splitter_to_ONU;将splitter连向OLT的端口错误接到了ONU上,拓扑逻辑不成立,需要按实际需求调整连接关系。
内容的提问来源于stack exchange,提问作者Kanw Mpam
相关产品推荐
相关产品推荐

