【问题标题】:What library in OpenDDS contains "OpenDDS::DCPS::operator<<"?OpenDDS 中的哪个库包含“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 等数据类型的结构的成员字段,则不会出现错误,并且一切都可以正常链接。

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

【问题讨论】:

    标签: data-distribution-service opendds


    【解决方案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隐藏了前后下划线。
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    相关资源
    最近更新 更多