2011-01-18 2 views
7

У меня возник вопрос о создании/связи DLL в Visual Studio 2005 и более поздних версиях. В основном мое понимание и опыт таковы:Visual Studio C++: Когда я должен использовать __declspec (dllimport)?

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

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

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

Спасибо!

+0

Возможный дубликат [Почему/когда __declspec (dllimport) не требуется?] (Http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed) –

ответ

13

Да, вы должны использовать __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 
{ 
... 
}; 
+1

Отличный ответ, спасибо! Я взглянул на источник для некоторых DLL, и они, кажется, все будут разработаны так, как вы указали. Мне все еще интересно, почему код этого учебника MSDN Microsoft уходит без использования __declspec (dllimport)? -> http://msdn.microsoft.com/en-us/library/ms235636.aspx – Russel

+3

@Russel: dllimport не требуется, но я считаю, что это лучшая практика. См. Это: http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed – trojanfoe

+0

См. [Библиотеки динамических ссылок] (https://msdn.microsoft.com/en-us /library/windows/desktop/ms682589(v=vs.85).aspx) и [Пошаговое руководство: создание и использование библиотеки динамических ссылок (C++)] (https://msdn.microsoft.com/en-us/library/ ms235636 (v = vs.140) .aspx). Все это объясняется в них более широко. Мое [Статическое и динамическое связывание] (http://simplesamples.info/Beginners/StaticVersusDynamic.aspx) может немного помочь. – user34660

Смежные вопросы