Я просто ищу простое и лаконичное объяснение разницы между этими двумя. MSDN здесь не вдавается в подробности.





__declspec(dllexport) сообщает компоновщику, что вы хотите, чтобы этот объект был доступен для импорта другими DLL. Он используется при создании DLL, на которую могут ссылаться другие.
__declspec(dllimport) импортирует реализацию из библиотеки DLL, чтобы ваше приложение могло ее использовать.
Я только начинающий разработчик C / C++, так что, возможно, у кого-то есть лучшее объяснение, чем у меня.
Два разных варианта использования:
1) Вы определяете реализацию класса в dll. Вы хотите, чтобы другая программа использовала этот класс. Здесь вы используете dllexport, поскольку вы создаете класс, который вы хотите, чтобы dll открывала.
2) Вы используете функцию, предоставляемую dll. Вы включаете заголовок, поставляемый с dll. Здесь заголовок использует dllimport для ввода реализации, которая будет использоваться текущей программой.
Часто в обоих случаях используется один и тот же файл заголовка и определяется макрос. Конфигурация сборки определяет макрос, который нужно импортировать или экспортировать, в зависимости от того, что ему нужно.
Dllexport используется для пометки функции как экспортированной. Вы реализуете функцию в своей DLL и экспортируете ее, чтобы она стала доступной для всех, кто использует вашу DLL.
Dllimport наоборот: он отмечает функцию как импортируемую из DLL. В этом случае вы только объявляете подпись функции и связываете свой код с библиотекой.
__declspec( dllexport ) - класс или функция, помеченные таким образом, будут экспортированы из библиотеки DLL, в которую они встроены. Если вы создаете DLL и вам нужен API, вам необходимо использовать этот или отдельный файл .DEF, который определяет экспорт ( MSDN). Это удобно, потому что определение хранится в одном месте, но файл .DEF предоставляет больше возможностей.
__declspec( dllimport ) - помеченный таким образом класс или функция будет импортирован из библиотеки DLL. На самом деле это не обязательно - вам нужна библиотека импорта так или иначе, чтобы компоновщик был доволен. Но при правильной маркировке dllimport компилятор и компоновщик имеют достаточно информации для оптимизации вызова; без него вы получите обычную статическую ссылку на функцию-заглушку в библиотеке импорта, которая добавляет ненужную косвенность. ONT1ONT2
Очень хорошая информация о последствиях неиспользования
dllimport.