Скомпилировать библиотеку шаблонов только для заголовков в общую библиотеку? - PullRequest
9 голосов
/ 08 сентября 2011

Мы находимся в процессе разработки новой библиотеки C ++ и решили использовать основанный на шаблонах подход вместе с некоторыми частичными частичными шаблонными специализациями для угловых случаев. В частности, это будет библиотека шаблонов только для заголовка .

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

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

Ответы [ 4 ]

6 голосов
/ 08 сентября 2011

Да.Что вы можете сделать - это явно создать шаблоны в файлах CPP, используя явный синтаксис создания шаблонов в компиляторе.Вот как использовать явное создание экземпляров в VC ++: http://msdn.microsoft.com/en-us/library/by56e477(v=VS.100).aspx. G ++ имеет похожую особенность: http://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html#Template-Instantiation.

Обратите внимание, что в C ++ 11 введен стандартный синтаксис для явного создания экземпляров, описанный в [14.7.2] Явное создание экземпляра FDIS:

Синтаксис явного создания экземпляра:

явное создание :

extern опт template декларация

3 голосов
/ 08 сентября 2011

Общая библиотека C ++ с шаблонами: ошибка неопределенных символов Некоторые ответы там охватывают эту тему. Подводя итог коротко: это возможно, если вы принудительно создаете экземпляры шаблонов в коде общей библиотеки. Это потребует явной спецификации для всех используемых типов для всех используемых шаблонов на стороне совместно используемой библиотеки.

1 голос
/ 08 сентября 2011

Если это действительно только шаблоны, то нет общей библиотеки.Посмотрите различные Boost проекты для конкретных примеров.Только когда у вас есть не шаблонный код, у вас будет библиотека.Конкретным примером является, например, Boost Date_Time и форматирование и анализ даты;Вы можете использовать библиотеку с или без этой функции и, следовательно, с или без связи.

Отсутствие разделяемой библиотеки - это хорошо в том смысле, что у вас меньше зависимостей.Недостатком является то, что ваши двоичные файлы могут стать немного больше, и что у вас несколько выше затраты времени компиляции.Но хранение довольно дешевое (если вы не работаете во встроенных системах по другим специальным причинам), и компиляция обычно стоит фиксированная разовая плата.

0 голосов
/ 08 сентября 2011

Хотя стандартного способа сделать это не существует, обычно это возможно с помощью методов, специфичных для реализации.Я сделал это давным-давно с Borland C ++ Builder.Идея состоит в том, чтобы объявить ваши шаблоны экспортируемыми из общей библиотеки, где они должны находиться, и импортировать их там, где они используются.Я сделал это следующим образом:

// A.h
#ifdef GENERATE
#  define DECL __declspec(dllexport)
#else
#  define DECL __declspec(dllimport)
#endif

template <typename T> class DECL C {
};

// A.cpp
#define GENERATE
#include "A.h"

template class DECL A<int>;

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...