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

Posted

技术标签:

【中文标题】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 中的哪个库包含“OpenDDS::DCPS::operator<<”?的主要内容,如果未能解决你的问题,请参考以下文章

使用开源库opendds实现数据分发服务dds 这个是啥意思? 谢谢各位大大~

OpenDDS:如何通过公共网络(WAN)通信两台主机

OpenDDS - Windows下安装过程(VS2015)

为啥 OpenDDS 无法编译?

Opendds-3.13 发布构建失败

配置 OpenDDS