Ich versuche eine statische Bibliothek zu erstellen, die Definitionen von DDS-Themen enthält, die aus verschiedenen IDL-Dateien stammen. Ich verwende OpenDDS als meine Middleware.Verhindern von Template-Instanziierungen in einer statischen Bibliothek
Wenn ich eine IDL-Datei mit einer sequence<long>
erstellen, kompilieren sie in meine statische Bibliothek, und verknüpfen Sie dann die statische Bibliothek gegen meine Anwendung, erhalte ich Linkerfehler mehrere Definition von Symbolen beteiligt:
Error LNK2005 "public: void __cdecl TAO::unbounded_value_sequence<int>::length(unsigned int)" ([email protected][email protected]@[email protected]@[email protected]) already defined in TAO.lib(TAO.dll)
Ich glaube, Dies liegt daran, dass meine statische Bibliothek eine Vorlageninstanziierung von unbounded_value_sequence
enthält und meine Anwendung auch eine Instanziierung enthält. Es scheint von ACE TAO zu kommen, das von OpenDDS verwendet wird.
Ich bin auf der Suche nach einer Möglichkeit, die Vorlage in meiner statischen Bibliothek insgesamt zu vermeiden, so dass es nur die Definition innerhalb der Anwendung verwenden kann, wenn sie miteinander verknüpft sind. Ich habe versucht, das Hinzufügen der folgenden:
extern template class TAO::unbounded_value_sequence<int>;
Dies erzeugt den folgenden Fehler:
Error C2961 'TAO::unbounded_value_sequence<CORBA::Long>': inconsistent explicit instantiations, a previous explicit instantiation did not specify '__declspec(dllimport)'
Ich habe versucht, dass Instantiierung ausfindig zu machen, aber es ist nicht in meinem Code. Es kann in ACE selbst sein.
Das Problem tritt nicht auf, wenn ich alles in dem einen Projekt baue, aber das ist keine ideale Lösung.