Visual Studio C ++: когда мне следует использовать __declspec (dllimport)? - PullRequest
7 голосов
/ 18 января 2011

У меня был вопрос о сборке / компоновке DLL в Visual Studio 2005 и более поздних версиях.В основном мое понимание и опыт таковы:

Чтобы создать DLL, я указываю свойства проекта для создания DLL, а затем я __declspec (dllexport) перед любыми функциями или членами, которые я хочу публично представитьиз DLL.Сборка проекта приведет к созданию библиотеки DLL, библиотеки Lib и заголовочного файла, которые можно развернуть как, скажем, API или что-то подобное.

С другой стороны, чтобы другое скомпилированное исполняемое приложение динамически связывалось с DLLи использовать его функции, вам просто нужно, чтобы ваш исполняемый проект включал заголовочные файлы и связывался с небольшим файлом lib, который был создан при сборке DLL.Пока скомпилированное приложение сможет найти DLL, все будет работать.

Это был мой опыт, и так же в руководстве по сборке Microsoft DLL все описывалось в MSDN.Мне интересно: это стандартная практика?Когда вам когда-нибудь понадобится где-нибудь использовать __declspec (dllimport)?Я что-то упустил?

Спасибо!

1 Ответ

13 голосов
/ 18 января 2011

Да, вы бы использовали __declspec (dllimport), и у вас обычно есть макрос, который контролирует, экспортирует ли исходный файл (если он является частью вашей DLL) или импортирует (если он является частью исполняемого файла) символы.

В вашей DLL вы можете установить константу манифеста для каких-либо настроек сборки, скажем 'BUILDING_MY_DLL', а затем создать такой макрос в вашем заголовочном файле:

#ifdef BUILDING_MY_DLL
#define MY_DLL_EXPORT __declspec(dllexport)
#else
#define MY_DLL_EXPORT __declspec(dllimport)
#endif

и затем украсить экспортированный файл.такие функции:

MY_DLL_EXPORT int func(int y);

Вы также можете экспортировать целые классы таким же образом:

class MY_DLL_EXPORT InterestingClass
{
...
};
...