Общий подход заключается в один макрос (назовем его EXPORT
), которые либо расширяющийся к dllimport
или dllexport
в зависимости от того, какая-то «строить DLL прямо сейчас» определить это установить, как это:
#ifdef MAKEDLL
# define EXPORT __declspec(dllexport)
#else
# define EXPORT __declspec(dllimport)
#endif
class EXPORT xyz {
// ...
};
идея заключается в том, что при построении DLL, вы добавляете MAKEDLL
к определениям препроцессора. Таким образом, весь код будет экспортироваться. Клиенты, которые ссылаются на вашу DLL (и, следовательно, включают этот заголовочный файл), вообще ничего не должны делать. Не определяя MAKEDLL
, они автоматически импортируют весь код.
Преимущество этого подхода в том, что бремя получения макросов вправо перемещается от многих (клиентов) только к автору DLL.
Недостатком этого является то, что при использовании вышеприведенного кода уже невозможно просто скомпилировать код непосредственно в какой-либо клиентский модуль, так как невозможно определить макрос EXPORT
. Для этого вам понадобится еще одна проверка, которая, если она истинна, не определяет EXPORT.
На несколько другую тему: во многих случаях невозможно (или желательно!) Экспортировать полный класс. Вместо этого вы можете просто экспортировать нужные символы. Например, в вашем случае вы можете просто экспортировать два общедоступных метода. Таким образом, все частные/защищенные члены не будут экспортироваться:
class xyz
{
public:
EXPORT void printing();
EXPORT void printing(int a);
};
К моему удивлению, я не сделал найти существующий вопрос, который этот дублирует. Я бы подумал, что это довольно распространенный вопрос. –
Проверьте: http://stackoverflow.com/questions/6620791/exporting-classes-to-dlls – Ajay