2016-11-01 34 views
1

Я пытаюсь создать статическую библиотеку, содержащую определения тем DDS, полученных из различных файлов IDL. Я использую OpenDDS в качестве своего промежуточного программного обеспечения.Предотвращение экземпляров шаблонов в статической библиотеке

Когда я создаю файл IDL, содержащий sequence<long>, скомпилировать его в мою статическую библиотеку, а затем связать статическую библиотеку против моего приложения, я получаю сообщение об ошибке компоновщика с участием множественного определения символов:

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)  

Я считаю, это связано с тем, что моя статическая библиотека содержит экземпляр шаблона unbounded_value_sequence, и мое приложение также содержит экземпляр. Кажется, это происходит из ACE TAO, который используется OpenDDS.

Я ищу способ избежать создания экземпляра шаблона в моей статической библиотеке в целом, чтобы он мог просто использовать определение в приложении, когда они связаны друг с другом. Я попытался добавить следующее:

extern template class TAO::unbounded_value_sequence<int>; 

Это произвело следующее сообщение об ошибке:

Error C2961 'TAO::unbounded_value_sequence<CORBA::Long>': inconsistent explicit instantiations, a previous explicit instantiation did not specify '__declspec(dllimport)' 

Я пытался найти, что создание экземпляра, но это не в моем коде. Это может быть в самом ACE.

Проблема не возникает, если я строю все в одном проекте, но это не идеальное решение.

ответ

1

Что вам нужно сделать, чтобы использовать шаблоны extern, немного отличается. Действительно, объявление шаблона extern предотвратит его создание. Но вам понадобится instanciation где-то. Это где-то обычно находится в cpp с именем шаблона, который вы хотите скомпилировать.

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 

Это сделает ваш шаблон быть обработан только один раз, в вашей библиотеке. Компилятор сгенерирует объектный файл unbounded_value_sequence, содержащий ваши экземпляры шаблонов. Они будут существовать только там.

Не забывайте, что вам все равно нужно сделать реализацию шаблона видимой в заголовке, если вы хотите, чтобы пользователи вашей библиотеки использовали ваш шаблонный класс с их помощью.