2016-11-17 93 views
0

我遇到了一个问题,将我的共享库链接到OpenDDS(v3.9)静态库,因为我无法找到此方法签名所在的位置。OpenDDS中的哪个库包含“OpenDDS :: DCPS :: operator <<”?

这是错误。

[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 

通过编译IDL自动生成ABTypeSupportImpl.cpp。接下来会出现更多相同的错误。由于名称空间(OpenDDS :: DCPS),我认为这可以在库libOpenDDS_Dcps.a中找到,但是在此lib上使用nm,然后grep'ing为“运算符”或“<”,不会产生任何结果。难道这个名字对于重载操作符来说有点陌生吗?我在$ DDS_ROOT/lib中的每个库文件上运行这个函数,但什么也没找到。

如果我重新编译IDL并删除数据类型如短或长的结构的成员字段,那么没有错误,并且一切都很好。

任何人都知道此方法签名可能位于哪个库?

回答

1

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

+0

告诉我的程序是否内联,我认为是一种内部优化,编译器可以选择或不选择这样做。至少这是我的理解。我没有特别禁用我编译中的任何东西。我一直在尝试各种标志。 – Ender

+0

此外,我试过GCC优化选项与01和更高,这似乎做了很多内联函数,但仍然没有去。 – Ender

+0

在OpenDDS(和ACE)中有一个用于启用或禁用内联方法的定义,它是代码级使用内联或不内联的功能。尝试将__ACE_INLINE__或ACE_NO_INLINE添加到编译器定义的编译代码时,请检查OpenDDS编译在编译OpenDDS时使用哪一个 –