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
相关产品推荐
相关产品推荐

