You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Omnet++运行INET下RDMA场景报undefined reference错误如何解决

错误成因
  • 新增RDMA相关代码未纳入INET构建规则:自定义的Rdma.cc、RdmaHeader.msg等文件未添加到INET的编译源文件列表,编译生成libINET.so时未包含对应目标文件,运行时动态库加载找不到对应符号。
  • MSG文件未正确处理:RdmaHeader类基于.msg定义生成,若.msg文件未通过OMNeT的MSG编译器处理,不会生成对应的C代码,构造函数、成员函数、typeinfo等符号都会缺失。
  • 虚函数未实现:Rdma类继承了INET生命周期管理接口,handleStartOperation、handleStopOperation、handleCrashOperation、getEphemeralPort等函数仅在头文件声明,无具体实现代码。
  • 命名空间不匹配:报错中存在全局命名空间下的::RdmaHeader::setSrcPort符号,说明代码部分位置未纳入inet命名空间,声明与实现的命名空间不一致导致符号匹配失败。
  • 编译缓存残留:增量编译时未覆盖旧的编译缓存,新修改的代码未被编译进libINET.so。
解决办法
  • 补全构建配置:将新增的Rdma.cc、RdmaHeader.msg文件添加到对应模块目录下的.oppbuildspec或srcfiles文件中,确保文件被纳入INET编译列表。
  • 正确处理MSG文件:在RdmaHeader.msg头部添加namespace inet;声明,确认文件已通过opp_msgc工具生成对应的_m.h和_m.cc文件,且生成的文件也纳入编译列表。
  • 补全函数实现:给Rdma类的生命周期处理函数、getEphemeralPort函数补全实现代码,暂时写空实现也可先解决链接报错。
  • 统一命名空间:检查Rdma、RdmaHeader的声明与实现均处于inet命名空间下,避免全局命名空间出现重复的类定义。
  • 全量重编译INET:执行make cleanall清空所有编译缓存,再执行make完整编译INET,确保所有新增代码都被编译进libINET.so。
  • 独立仿真项目额外配置:若RDMA代码写在独立仿真项目而非直接修改INET源码,需在项目执行opp_makemake时添加对应RDMA源文件编译规则,同时正确链接INET库。

内容的提问来源于stack exchange,提问作者VR4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 12:45:00