2016-11-17 4 views
0

Ich habe ein Problem beim Verknüpfen meiner gemeinsam genutzten Bibliothek mit einer statischen OpenDDS (v3.9) -Bibliothek, da ich nicht finden kann, wo sich diese Methodensignatur befindet.Welche Bibliothek in OpenDDS enthält "OpenDDS :: DCPS :: operator <<"?

Hier ist der Fehler.

[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 wird automatisch generiert aus der IDL kompilieren. Weitere Fehler folgen. Wegen des Namespace (OpenDDS :: DCPS) würde ich denken, dass dies innerhalb der Bibliothek libOpenDDS_Dcps.a gefunden werden würde, aber das Verwenden von nm auf dieser lib und dann grep'ing für "operator" oder "< <" führt zu keinen Ergebnissen. Könnte es sein, dass der Name Mangling für überlastete Betreiber ein bisschen seltsam ist? Ich habe dies für jede Bibliotheksdatei innerhalb von $ DDS_ROOT/lib ausgeführt, aber nichts gefunden.

Und wenn ich die IDL neu zu kompilieren und Elementfelder von Strukturen mit Datentypen wie kurz oder lang zu entfernen, dann gibt es keine Fehler und alles funktioniert gut.

Wer weiß, in welcher Bibliothek diese Methodensignatur gefunden werden kann?

Antwort

1

Diese Operatoren sind in 'dds/DCPS/Serializer.h' deklariert, aber inline in Serializer.inl implementiert. Wahrscheinlich kompilieren Sie OpenDDS mit aktiviertem Inlining (Standard), aber wenn Sie Ihre Anwendung kompilieren, kompilieren Sie mit Inlining deaktiviert.

+0

Wenn ich mein Programm inline oder nicht anzeige, denke ich, dass es sich um eine interne Optimierung handelt, die der Compiler wählen kann oder auch nicht. Zumindest ist das mein Verständnis. Ich deaktiviere nichts in meiner Kompilierung. Ich habe verschiedene Flaggen ausprobiert. – Ender

+0

Ich habe auch GCC-Optimierungs-Optionen mit 01 und höher ausprobiert, die ziemlich viel für Inline-Funktionen zu tun scheinen, aber immer noch nicht gehen. – Ender

+0

Es gibt eine Definition, die in OpenDDS (und ACE) verwendet wird, um die Inlined-Methoden zu aktivieren oder zu deaktivieren. Es ist eine Funktion auf Codeebene, um Inlining zu verwenden oder nicht. Versuchen Sie, __ACE_INLINE__ oder ACE_NO_INLINE dem Compiler hinzuzufügen definiert beim Kompilieren Ihres Codes, welche OpenDDS-Kompilierung Sie beim Kompilieren von OpenDDS verwendet haben –