Я видел исходный код Qt вот так:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
Какой Q_CORE_EXPORT
макрос определяет, как показано ниже:
define Q_DECL_IMPORT __declspec(dllimport)
Так что же на __declspec(dllimport)
самом деле значит?
Ответы:
__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
.источник
__declspec
нотацию как расширение языка C ++. Я считаю, что GCC теперь поддерживает его, но это в первую очередь из соображений совместимости с компиляторами Microsoft. И я не понимаю, чем "специфичный для MS" отличается от "специфичного для компилятора". Microsoft написала компилятор C ++, и многие люди его используют. Он поставляется с Visual Studio.__declspec(dllimport)
- спецификатор класса хранения, который сообщает компилятору, что функция, объект или тип данных определены во внешней DLL.Функция, объект или тип данных экспортируется из библиотеки DLL с соответствующим файлом
__declspec(dllexport)
.источник
__declspec(dllexport)
сообщает компилятору проинформировать компоновщик о том, что эти символы необходимо поместить в таблицу экспорта (при компиляции .dll). При компиляции программы, которая связывается с .dll,__declspec(dllimport)
сообщает компилятору создать косвенный вызов с относительным отрывом и абсолютным косвенным регистром (который компоновщик заполнит разрешением, чтобы указать на таблицу импорта), а не обычный прямой вызов относительного преобразования с регистроминструкция косвенного вызова неопределенной функции (которая, поскольку она не может изменить инструкцию, компоновщик вставляет относительный адрес преобразователя, а затем создает преобразователь, внутри которого он помещает относительный абсолютный регистр косвенного косвенного вызова для указатель функции в таблице импорта). Это оптимизация размера кода и скорости. Это библиотека импорта .lib, которая сообщает компоновщику, какие символы будут импортированы, и используется в качестве руководства для создания таблицы импорта и создания любых необходимых переходников в сегменте .text.https://docs.microsoft.com/en-us/cpp/build/importing-function-calls-using-declspec-dllimport?view=vs-2019 https://docs.microsoft.com/en-us/cpp / build / importing-data-using-declspec-dllimport? view = vs-2019 https://stackoverflow.com/a/4490536/7194773
источник
Это означает, что определение функции находится в динамической библиотеке. Обратитесь к документации для получения более подробной информации и примеров.
источник