разница между dllexport и dllimport

80
03 марта 2021, 06:10

при создании dll файла, нужно указывать

__declspec(dllexport)
или
__declspec(dllimport)

в чем разница?

Answer 1

Источник информации

Когда вы объявляете класс dllexport, все его функции-члены и статические члены-данные экспортируются. Вы должны предоставить определения всех таких участников в одной программе. В противном случае генерируется ошибка компоновщика. Единственное исключение из этого правила относится к чисто виртуальным функциям, для которых вам не нужно предоставлять явные определения. Однако, поскольку деструктор для абстрактного класса всегда вызывается деструктором для базового класса, чистые виртуальные деструкторы всегда должны предоставлять определение. Обратите внимание, что эти правила одинаковы для неэкспортируемых классов. Если вы экспортируете данные типа класса или функции, которые возвращают классы, обязательно экспортируйте класс.

Когда вы объявляете класс dllimport, все его функции-члены и статические члены-данные импортируются. В отличие от поведения dllimport и dllexport, статические данные-члены класса, имеющие тип, не относящегося к классу, не могут указывать определение в той же программе, в которой определен класс dllimport.

Возможно перевод требует правки.

Answer 2

Надо указывать оба. В заголовочном файле пишете

#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.

READ ALSO
Минимальное расстояние в графе

Минимальное расстояние в графе

Дано связный невзвешенный граф с N вершинами N-1 ребромИ также подграф етого графа P

114
Сортировка пузырьком на С++

Сортировка пузырьком на С++

Есть задача: отсортировать пузырьковым методом массивЕсть код

127
Итерацию по вектору объектов

Итерацию по вектору объектов

QtCreator, cmakeНе даёт проитерироваться по вектору объектов и передать их в функцию

96
Как избавится от дублирования кода в шаблоне template?

Как избавится от дублирования кода в шаблоне template?

Всем привет, мне нужно построить код внутри шаблона который тоже будет шаблоном Вот мой код

117