__declspec
- это специфичный для Microsoft атрибут, позволяющий указать информацию о классе хранения.
(Уголок Nitpicker's: однако ряд других поставщиков компиляторов, например GCC, теперь поддерживают это языковое расширение для совместимости с установленной базой кода, который был написан для компиляторов Microsoft. Некоторые даже предоставляют дополнительные атрибуты класса хранилища.)
Два из этих атрибутов класса хранения, которые можно указать, - это dllimport
и dllexport
. Они указывают компилятору, что функция или объект импортируются или экспортируются (соответственно) из DLL.
В частности, они определяют интерфейс DLL для клиента, не требуя .DEF
файла определения модуля ( ). Большинству людей гораздо проще использовать эти языковые расширения, чем создавать файлы DEF.
По понятным причинам __declspec(dllimport)
и __declspec(dllexport)
обычно в паре друг с другом. Вы используете, dllexport
чтобы пометить символ как экспортированный из DLL, и вы используете, dllimport
чтобы импортировать этот экспортированный символ в другой файл.
Из-за этого и поскольку один и тот же файл заголовка обычно используется как при компиляции DLL, так и в клиентском коде, который использует интерфейс DLL, это общий шаблон для определения макроса, который автоматически разрешается в соответствующий спецификатор атрибута во время компиляции. Например:
#if COMPILING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
Затем отметьте все символы, которые должны быть экспортированы DLLEXPORT
.
Предположительно, это то, что Q_CORE_EXPORT
делает макрос, разрешая либо Q_DECL_IMPORT
или Q_DECL_EXPORT
.