OpenDDS 环境搭建

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenDDS 环境搭建相关的知识,希望对你有一定的参考价值。

参考技术A 1.概述
ACE是一个开源框架,它为开发高性能、分布式实时和嵌入式系统提供了许多组件和模式。ACE为套接字、解复用循环、线程和同步原语提供了强大而高效的抽象。
TAO(ACE-ORB)是CORBA对象请求代理(ORB)的开源实现,它是使用ACE框架中的组件和模式构建的。
CIAO(Component Integrated ACE ORB)是构建在TAO之上的CORBA组件模型(CCM)的开源实现。
DAnCE是构建在TAO之上的部署和配置标准(D&C)的开源实现。
OpenDDS是OMG数据分发服务(DDS)的一个开源实现

2.win7下安装
//环境
vs2015
perl5.18.4 x86
ACE+TAO-6.5.10
OpenDDS-DDS-3.12.2

1)安装perl
解压安装,安装完成后查看perl -v

2)安装ACE+TAO
//解压、设置环境变量
解压到目录,例如我把ACE和DDS都放到了openDDS的目录下,C:\openDDS\ACE_wrappers,C:\openDDS\DDS
设置环境变量:
添加方环境变量方法自己百度,
ACE_ROOT= C:\openDDS\ACE_wrappers//就是你的存放路径
TAO_ROOT= C:\openDDS\ACE_wrappers\TAO
在Path后面加:%ACE_ROOT%\lib; %ACE_ROOT%\bin
注意分号

//添加config.h
在%ACE_ROOT%/ace下添加config.h文件,内容为

//生成工程文件
打开 ACE_vc14.sln,环境选择debug-x86
项目-重订解决方案目标-确定
生成解决方案

以上ACE的编译完成,然后进入TAO目录,按照上述步骤生成TAO_ACE_vc14.sln

3)编译OpenDDS
解压OpenDDS到相关文件,设置环境变量
DDS_ROOT=C:\openDDS\DDS //这里是你自己的解压目录
添加Path:%DDS_ROOT%\lib;%DDS_ROOT%\bin

使用vs生成工具生成DDS的VS工程文件
cd DDS
.\config
报错时,修改config文件,找到报错行,修改compiler_version,指定版本
$opts'compiler_version'="vc14";

打开生成的dds.sln,按照ACE的步骤生成解决方案

4)测试
OpenDDS-3.12.2\examples\DCPS\Messenger_Imr下执行
run_test.pl ,执行结果为test passed为成功

3.opendss使用
1)新建 Messenger.idl文件
module Messenger
#pragma DCPS_DATA_TYPE "Messenger::Message"
#pragma DCPS_DATA_KEY "Messenger::Message subject_id"
struct Message
string from;
string subject;
long subject_id;
string text;
long count;
;
;

2)编译生成文件
tao_idl Messenger.idl
opendds_idl Messenger.idl
tao_idl -I../OpenDDS-3.12.2 MessengerTypeSupport.idl

OpenDDS 中的哪个库包含“OpenDDS::DCPS::operator<<”?

【中文标题】OpenDDS 中的哪个库包含“OpenDDS::DCPS::operator<<”?【英文标题】:What library in OpenDDS contains "OpenDDS::DCPS::operator<<"? 【发布时间】:2016-11-17 02:39:58 【问题描述】:

我在将我的共享库与 OpenDDS (v3.9) 静态库链接时遇到问题,因为我无法找到此方法签名的位置。

这是错误。

[exec] libs/mylib/ABTypeSupportImpl.cpp:74: error: undefined reference to 'OpenDDS::DCPS::operator<<(OpenDDS::DCPS::Serializer&, short)'
[exec] collect2: error: ld returned 1 exit status
[exec] make: *** [/tmp/mybuild/lib_ab/obj/local/armeabi-v7a/lib_ab.so] Error 1

ABTypeSupportImpl.cpp 是通过编译 IDL 自动生成的。更多相同的错误随之而来。由于命名空间(OpenDDS::DCPS),我认为这可以在库 libOpenDDS_Dcps.a 中找到,但是在这个库上使用 nm,然后 grep 查找“operator”或“

如果我重新编译 IDL 并删除具有 short 或 long 等数据类型的结构的成员字段,则不会出现错误,并且一切都可以正常链接。

有人知道这个方法签名可能位于哪个库吗?

【问题讨论】:

【参考方案1】:

这些运算符在 'dds/DCPS/Serializer.h' 中声明,但在 Serializer.inl 中内联实现。可能你编译 OpenDDS 时启用了内联(默认),但是当你编译你的应用程序时,你编译时禁用了内联。

【讨论】:

告诉我的程序是否内联,我认为,是编译器可能会或可能不会选择做的内部优化。至少这是我的理解。我没有在我的编译中专门禁用任何东西。我一直在尝试各种标志。 另外,我尝试了 01 及更高版本的 GCC 优化选项,这似乎对内联函数做了很多,但仍然没有成功。 OpenDDS(和ACE)中有一个定义用于启用或禁用内联方法,使用或不使用内联是代码级别的功能。尝试在编译代码时将 ACE_INLINE 或 ACE_NO_INLINE 添加到编译器定义中,检查 OpenDDS 编译时使用了哪个编译 OpenDDS DCPS/Serializer.cpp 显示它正在使用 ACE_INLINE 进行编译(无法从 *.inl 文件中看出),并且通过将其添加到我的程序编译中,它看来编译成功了。谢谢。 Con't:啊,刚刚明白你使用的ACE_INLINE和我一样,但是markdown隐藏了前后下划线。

以上是关于OpenDDS 环境搭建的主要内容,如果未能解决你的问题,请参考以下文章

flink开发环境搭建maven环境搭建IDEA环境搭建

配置 OpenDDS

如何搭建Appium测试环境

LNMP环境的搭建与配置(二)

如何搭建MTK6261的开发环境

AndroidStudio 离线环境搭建