2016-11-01 6 views
1

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.

Antwort

1

Was Sie tun müssen, um externe Vorlagen zu verwenden, ist etwas anders. In der Tat, die externe Vorlage zu deklarieren wird die Instanziierung verhindern. Aber Sie brauchen eine Instanziierung irgendwo. Das ist irgendwo in einer cpp mit dem Namen der Vorlage, die Sie kompilieren möchten.

unbounded_value_sequence.h:

// template struct here 

extern template class TAO::unbounded_value_sequence<int>; 
extern template class TAO::unbounded_value_sequence<long>; 
// and every other instantiation you want to be in your static library 

unbounded_value_sequence.cpp:

#include "unbounded_value_sequence.h" 

// Here you compile them one time. 
template class TAO::unbounded_value_sequence<int>; 
template class TAO::unbounded_value_sequence<long>; 
// and every other instantiation you want to be in your static library 

Das Template machen wird nur ein einziges Mal instanziiert werden, in Ihrer Bibliothek. Der Compiler generiert eine unbounded_value_sequence Objektdatei, die Ihre Template-Instanziierungen enthält. Sie werden nur dort existieren.

Vergessen Sie nicht, dass Sie Ihre Vorlagenimplementierung weiterhin in der Kopfzeile anzeigen müssen, wenn Benutzer Ihrer Bibliothek Ihre Vorlagenklasse mit ihren verwenden möchten.

Verwandte Themen