при создании dll файла, нужно указывать
__declspec(dllexport)
или
__declspec(dllimport)
в чем разница?
при создании dll файла, нужно указывать
__declspec(dllexport)
или
__declspec(dllimport)
в чем разница?
Надо указывать оба. В заголовочном файле пишете
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
и у объявлений функций и классов используете макрос MYDLL_API.
void MYDLL_API api_func();
Затем DLL компилируете с -DMYDLL_EXPORTS и у неё получается dllexport, а те кто импортируют эту DLL, они компилирутся без MYDLL_EXPORTS и получают dllimport.
Когда вы объявляете класс
dllexport, все его функции-члены и статические члены-данные экспортируются. Вы должны предоставить определения всех таких участников в одной программе. В противном случае генерируется ошибка компоновщика. Единственное исключение из этого правила относится к чисто виртуальным функциям, для которых вам не нужно предоставлять явные определения. Однако, поскольку деструктор для абстрактного класса всегда вызывается деструктором для базового класса, чистые виртуальные деструкторы всегда должны предоставлять определение. Обратите внимание, что эти правила одинаковы для неэкспортируемых классов. Если вы экспортируете данные типа класса или функции, которые возвращают классы, обязательно экспортируйте класс.Когда вы объявляете класс
dllimport, все его функции-члены и статические члены-данные импортируются. В отличие от поведенияdllimportиdllexport, статические данные-члены класса, имеющие тип, не относящегося к классу, не могут указывать определение в той же программе, в которой определен классdllimport.
Возможно перевод требует правки.