此文用于辅助构建类似于OpenDDS\DevGuideExamples\DCPS\Messenger的Demo示例
OpenDDS安装环境构建+Demo实践(自己动手写一个)
- 本文相关参考资料
- OpenDDS安装环境构建
- 参考博客
- Demo上手实践(依赖于Windows下的OpenDDS环境)
- OpenDDS安装环境搭建完成
- Demo实践过程中出现的问题
- 编写IDL文件出现的问题
- 编译IDL出现的问题
- VS2019生成解决方案时的问题
本文相关参考资料
OpenDDS开发者文档
OpenDDS安装环境构建
参考博客
OpenDDS开发环境搭建(Windows 10+Visual Studio 2019)
这是一篇Windows下的环境搭建,要想同步Linux开发环境,参考OpenDDS的GitHub开源网站
Demo上手实践(依赖于Windows下的OpenDDS环境)
OpenDDS安装环境搭建完成
OpenDDS安装环境搭建完成以后,深度参考OpenDDS开发者文档Chapter 2章节内容进行Demo实践流程,这里不赘述具体各项内容,仅分享Demo实践过程中遇到的问题(
1.如果你也遇到了像我一样的问题,欢迎来留言区讨论。
2.如果你遇到了新问题,欢迎来留言区讨论。
3.如果你愿意,我们可以将新问题汇总到这里。我会备注清楚来源,当然你也可以链接出去补充,提前感谢~)
Demo实践过程中出现的问题
编写IDL文件出现的问题
- IDL注释
IDL是不能用//注释的,否则会在编译的时候出现问题。例如你在IDL里面定义了一个属性,你想在后面注释它代表什么,我习惯了用//注释,所以当初编译的时候出现过问题,也算一个小问题吧。具体注释的格式我也未细细探究。 - IDL的版本不同,topic与key的定义语法不同
IDL3:
#pragma DCPS_DATA_TYPE "Demo::Message"
#pragma DCPS_DATA_KEY "Demo::Message id"
IDL4:
用类型注释的方法即可。分别为@topic和@key
如果在编译IDL文件的时候,提示:错误使用了IDL4的特性,是因为你当前默认使用的是IDL3,只需要在编译的时候使用 --idl-version 4 指定IDL的版本为4即可。
- IDL 匿名序列类型的问题
算是一个大问题。折腾了我好久。我在之前的IDL文件中定义了一个类型为sequence的属性:
sequence<double> Data;
导致后续在编译的过程中出现了链接多重定义的问题,排查了好久。发现:
这是官网给出的一段描述,大致意思就是TAO内部已经有了这些序列类型的定义,而你直接定义sequence则会在编译的时候链接报错。修改方法就是上面描述的那样,在你的IDL文件中,包含相关序列类型的pidl文件即可。如下所示:
#include <tao/DoubleSeq.pidl>
module Demo {
@topic
struct Message {
@key long id;
double a;
double b;
double c;
CORBA::DoubleSeq Data;
};
};
编译IDL出现的问题
这里有两种编译方式,一种是MPC工具,一种是显式执行tao_idl,opendds_idl。网上的大多数教程,在使用MPC工具直接生成vs2019的.sln文件的时候并没有生成相应的DemoTypeSupport*的IDL类型支持文件,生成解决方案时也会出现错误(一般生成解决方案的时候会给你提示相关错误),究其原因,就是你的IDL文件本身就存在问题。所以下次用MPC工具之前,可以先用显式执行编译一下你的IDL文件,这时候它会给你提示相应的报错信息,你也好排查IDL文件的错误。
VS2019生成解决方案时的问题
总之我是先把相关的Publisher.cpp,Subscriber.cpp,DataReaderListenerImpl.cpp都完成以后再生成的解决方案,没有尝试未编写就生成解决方案,我看网上的大多数教程评论中出现的问题,根据错误反馈,应该就是这些文件没有补充完成出现的错误。我的建议是,先参照OpenDDS开发者文档将上述三个文件完成以后,再编译。
当你vs生成解决方案,编译都成功的时候,基本上Demo就已完成,简单点的话,你就直接开3个vs终端,转到项目目录下,按OpenDDS开发者文档中的启动顺序,启动即可。如果通信出现问题,就是你的上述3个cpp文件有问题