小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
HelloFish例程
-
我想问一下我按小鱼的教程进行HelloFishros例程进行make编译,怎么会出现这样的错误:
sunboy@sunboy-desktop:~/dds_tutorial/examples/01-hellofishros/build$ make
Consolidate compiler generated dependencies of target DDSHelloFishRosPublisher
[ 12%] Building CXX object CMakeFiles/DDSHelloFishRosPublisher.dir/src/idl_generate/HelloFishRosPubSubTypes.cxx.o
/home/sunboy/dds_tutorial/examples/01-hellofishros/src/idl_generate/HelloFishRosPubSubTypes.cxx: In member function ‘virtual bool HelloWorldPubSubType::serialize(void*, SerializedPayload_t*)’:
/home/sunboy/dds_tutorial/examples/01-hellofishros/src/idl_generate/HelloFishRosPubSubTypes.cxx:61:108: error: ‘DDS_CDR’ is not a member of ‘eprosima::fastcdr::Cdr’
61 | er(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
| ^~~~~~~/home/sunboy/dds_tutorial/examples/01-hellofishros/src/idl_generate/HelloFishRosPubSubTypes.cxx:77:49: error: ‘class eprosima::fastcdr::Cdr’ has no member named ‘getSerializedDataLength’; did you mean ‘get_serialized_data_length’?
77 | payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
| ^~~~~~~~~~~~~~~~~~~~~~~
| get_serialized_data_length
/home/sunboy/dds_tutorial/examples/01-hellofishros/src/idl_generate/HelloFishRosPubSubTypes.cxx: In member function ‘virtual bool HelloWorldPubSubType::deserialize(SerializedPayload_t*, void*)’:
/home/sunboy/dds_tutorial/examples/01-hellofishros/src/idl_generate/HelloFishRosPubSubTypes.cxx:92:110: error: ‘DDS_CDR’ is not a member of ‘eprosima::fastcdr::Cdr’
92 | er(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
| ^~~~~~~/home/sunboy/dds_tutorial/examples/01-hellofishros/src/idl_generate/HelloFishRosPubSubTypes.cxx: In member function ‘virtual bool HelloWorldPubSubType::getKey(void*, InstanceHandle_t*, bool)’:
/home/sunboy/dds_tutorial/examples/01-hellofishros/src/idl_generate/HelloFishRosPubSubTypes.cxx:154:65: error: ‘class eprosima::fastcdr::Cdr’ has no member named ‘getSerializedDataLength’; did you mean ‘get_serialized_data_length’?
154 | m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
| ^~~~~~~~~~~~~~~~~~~~~~~
| get_serialized_data_length
make[2]: *** [CMakeFiles/DDSHelloFishRosPublisher.dir/build.make:104: CMakeFiles/DDSHelloFishRosPublisher.dir/src/idl_generate/HelloFishRosPubSubTypes.cxx.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:85: CMakeFiles/DDSHelloFishRosPublisher.dir/all] Error 2
make: *** [Makefile:91: all] Error 2 -
从你提供的编译错误信息来看,问题主要集中在
eprosima::fastcdr::Cdr
类的使用上。这里有几个关键的错误点:-
DDS_CDR
不是eprosima::fastcdr::Cdr
的成员:
DDS_CDR
看起来像是一个可能已经被弃用或不存在的枚举值。在eprosima::fastcdr::Cdr
中,通常使用Cdr::DEFAULT_ENDIAN
或Cdr::BIG_ENDIAN
来指定字节序。你应该检查你的代码或相关库文档,看看是否应该使用其他值或者这个值是否应该被完全省略(因为有时默认行为就足够了)。 -
getSerializedDataLength
方法不存在:
错误提示class eprosima::fastcdr::Cdr
has no member named ‘getSerializedDataLength’; did you mean ‘get_serialized_data_length’?表明
Cdr类中没有
getSerializedDataLength这个方法,但有一个可能的方法
get_serialized_data_length。你应该将代码中的
getSerializedDataLength()替换为
get_serialized_data_length()`。
解决步骤
-
修改
HelloFishRosPubSubTypes.cxx
中的Cdr
使用:- 移除或替换
DDS_CDR
的使用。检查eprosima::fastcdr::Cdr
的文档或源代码,了解正确的初始化方式。 - 将
getSerializedDataLength()
替换为get_serialized_data_length()
。
- 移除或替换
-
重新编译:
- 保存修改后的文件。
- 在你的构建目录(这里是
~/dds_tutorial/examples/01-hellofishros/build
)中,重新运行make
命令。
-
检查依赖和版本:
- 确保你使用的
eProsima Fast CDR
库版本与你的代码或教程相匹配。 - 如果你是从某个教程或示例代码开始,确保所有依赖都已正确安装,并且版本兼容。
- 确保你使用的
-
查阅文档和社区:
- 如果问题仍然存在,查阅
eProsima Fast CDR
的官方文档或社区论坛。 - 也可以尝试搜索是否有其他人遇到过类似的问题,并找到了解决方案。
- 如果问题仍然存在,查阅
通过这些步骤,你应该能够解决编译时出现的错误。如果问题依旧,请提供更多的上下文信息,如你使用的库版本、操作系统等,以便进一步分析问题。
以上为生成回答,仅供参考~
-
-
@401772473 看新教程看新教程
-
@小鱼 你说的新教程的链接能发我一下吗?是说的下面这个吗?
新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/ -
@401772473 是这个
-
@小鱼 好的小鱼。