что на самом деле означает declspec(dllimport)?



Я видел исходный код Qt следующим образом:



class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};


, который Q_CORE_EXPORT макрос определяет, как показано ниже:



define Q_DECL_IMPORT __declspec(dllimport)


так что __declspec(dllimport) на самом деле означает?

919   3  

3 ответов:

__declspec - это атрибут, специфичный для Microsoft, который позволяет указать информацию о классе хранения.
(угол Nitpicker: однако ряд других поставщиков компиляторов-например, 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.

__declspec(dllimport)-Это спецификатор класса хранения, который сообщает компилятору, что функция, объект или тип данных определены во внешней библиотеке DLL.

функция или объект или тип данных экспортируются из библиотеки DLL с соответствующим __declspec(dllexport).

Это означает, что определение функции в динамической библиотеке. См.документация для более подробной информации и примеров.

Comments

    Ничего не найдено.