В чем разница между dllexport и dllimport? - PullRequest
47 голосов
/ 12 сентября 2008

Я просто ищу простое, краткое объяснение разницы между этими двумя. MSDN не вдавался в подробности здесь.

Ответы [ 4 ]

78 голосов
/ 12 сентября 2008

__declspec( dllexport ) - Помеченный таким образом класс или функция будет экспортирован из библиотеки, в которую он встроен. Если вы создаете библиотеку DLL и вам нужен API, вам нужно использовать этот или отдельный файл .DEF это определяет экспорт ( MSDN ). Это удобно, потому что оно хранит определение в одном месте, но файл .DEF предоставляет больше опций.

__declspec( dllimport ) - Помеченный таким образом класс или функция будут импортированы из DLL. Это на самом деле не требуется - вам нужна библиотека для импорта в любом случае , чтобы компоновщик был доволен. Но при правильном обозначении dllimport компилятор и компоновщик имеют достаточно информации для оптимизации вызова; без этого вы получите обычную статическую ссылку на функцию-заглушку в библиотеке импорта, которая добавляет ненужную косвенность. ONT1 ONT2

44 голосов
/ 12 сентября 2008
  • __declspec(dllexport) сообщает компоновщику, что вы хотите, чтобы этот объект был доступен для импорта другими DLL. Используется при создании DLL, на которую могут ссылаться другие.

  • __declspec(dllimport) импортирует реализацию из DLL, чтобы ваше приложение могло ее использовать.

Я только начинающий разработчик C / C ++, поэтому, возможно, у кого-то есть лучшее объяснение, чем у меня.

8 голосов
/ 12 сентября 2008

Dllexport используется для пометки функции как экспортируемой. Вы реализуете функцию в своей DLL и экспортируете ее, чтобы она стала доступной любому, кто использует вашу DLL.

Dllimport противоположен: он помечает функцию как импортированную из DLL. В этом случае вы только объявляете подпись функции и связываете свой код с библиотекой.

8 голосов
/ 12 сентября 2008

Два разных варианта использования:

1) Вы определяете реализацию класса в dll. Вы хотите, чтобы другая программа использовала класс. Здесь вы используете dllexport при создании класса, который вы хотите, чтобы dll выставлял.

2) Вы используете функцию, предоставляемую DLL. Вы включаете заголовок, поставляемый с DLL. Здесь заголовок использует dllimport, чтобы ввести реализацию, которая будет использоваться текущей программой.

Часто один и тот же заголовочный файл используется в обоих случаях и определяется макросом. Конфигурация сборки определяет макрос для импорта или экспорта в зависимости от того, что ему нужно.

...