Позвольте мне начать с того, что я знаю, какова цель ключевого слова __declspec(dllexport)
. Но, экспериментируя ради этого, при импорте функций с этим ключевым словом по сравнению с тем, когда ключевое слово не используется, я не вижу никакой разницы в создаваемой / импортируемой таблице импорта / экспорта.
Для иллюстрации У меня есть проект DLL, который включает в себя заголовочный файл со следующим объявлением:
__declspec(dllexport) int somefunc(int, int)
А затем еще один проект, который создает функции импорта EXE из DLL:
#include "path_to_header_file_of_dll"
int main() {
somefunc();
}
Когда я собираю этот EXE-файл, кажется, что он компилируется и собирается нормально, хотя я объявил функцию как экспорт этого символа, когда он явно не экспортирует его, а только импортирует. Почему компилятор не жалуется? Также это не заставляет сгенерированный EXE иметь таблицу экспорта. Но вместо этого строит таблицу импорта. Компилятор, похоже, понял, что правильно делать, и делает это.
Если это работает, то зачем возиться с кодом, подобным приведенному ниже:
#ifdef BLEH
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
DLLEXPORT int somefunc(int, int);