2016-02-28 6 views
1

Ниже представлен мой сценарий: У меня есть исполняемый файл вместе с несколькими совместно используемыми библиотеками (.dll или .so). И исполняемые, и общие библиотеки (.dll или .so) используют набор общих библиотек. Поскольку они являются общими библиотеками, я хочу уменьшить двоичную печать стоп-библиотеки разделяемых библиотек, чтобы уменьшить стоп-печать разделяемой библиотеки. Я экспортирую содержимое общих библиотек из исполняемого файла и импортирую их в разделяемые библиотеки (dll или .so).Экспорт классов шаблонов C++

Примечание: Хотя размер отпечатка ноги не является единственным среди множества причин, на данный момент мы можем придерживаться его главной причины.

Задача: В общих библиотеках есть некоторые встроенные функции и некоторые классы шаблонов. Когда я компилирую исполняемые и разделяемые библиотеки, используя флаги оптимизации производительности, классы inlined/template встраиваются как в исполняемые, так и совместно используемые библиотеки. Это создаст проблемы, если модификации inline будут изменены, и есть несколько разделяемых библиотек с различным набором определений встроенных функций.

Как решить эту проблему?

Когда я начал думать об этом, даже классы STL, предоставляемые ЭЛТ, являются классами шаблонов. Подобная проблема существует даже в их случае. Решили ли они эту проблему? Что произойдет, если они изменят определение std :: vector? Пожалуйста помоги.

+0

Там нет такого понятия, как "шаблонного класса". C++ имеет * шаблоны классов *. Шаблон класса - это шаблон. Это не класс. Вы не можете экспортировать его из библиотеки. Вы также не можете экспортировать встроенную функцию из библиотеки. Вы решаете эту проблему, используя современный хорошо продуманный язык программирования. –

+0

Да Я ссылался на шаблон класса. Спасибо за Ваш ответ. Можете ли вы предложить другие альтернативы для решения этой проблемы? кроме изменения языка программирования. – Prasanna

+0

Знаете ли вы о одной библиотеке C++, которая решает вашу проблему? Посмотрите на стандартную библиотеку, которая поставляется вместе с вашим компилятором. Посмотрите на повышение. Это лучшие библиотеки C++. Вы хотите быть лучше, чем самые лучшие в мире? Это очень благородное желание, но разве вы не думаете, что спрашивать незнакомцев в Интернете, как это сделать, немного наивно? –

ответ

0

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

В вашем файле управления экспортом.

#ifdef XXXX_BUILD 
    #define XXXX_EXPORT __declspec(dllexport) 
    #define XXXX_EXTERN 
#else 
    #define XXXX_EXPORT __declspec(dllimport) 
    #define XXXX_EXTERN extern 
#endif 

где XXXX_BUILD - это символ, определенный в вашем проекте.

Чтобы получить доступ к вашему классу.

XXXX_EXTERN template class XXXX_EXPORT YourClass<double>; 

Где двойной тип, с которым вы хотите создать экземпляр класса.

https://support.microsoft.com/en-us/help/168958/how-to-export-an-instantiation-of-a-standard-template-library-stl-clas