Я слышал, что библиотеки импорта имеют «заглушки», поэтому исполняемый файл знает, какую DLL и функцию мы хотим. Теперь мой вопрос: что это за заглушки? На что они похожи? Как исполняемый файл устанавливает указатели в нужные места в DLL? И как это известно, если мы говорим о нормальной библиотеке или библиотеке импорта, поскольку оба они являются .lib-файлами?Как работают библиотеки импорта?
ответ
Средство MSVC не ссылается непосредственно на DLL, оно может ссылаться только на статическую библиотеку (.lib).
Очень грубо говоря, библиотека импорта является обычной статической библиотекой, которая имеет функцию заглушки для каждой экспортированной DLL функции.
Например, если DLL имеет функцию void func1()
и экспорт func1
, соответствующая библиотека импорта будет содержать функцию заглушки void __imp__func1() { __asm { jmp dword ptr func1; } }
Во время выполнения «скачок» будет принимать адрес func1
из таблицы импорта , Вот почему необходим заглушка.
В заявлении void __declspec(dllimport) func1();
в вашем заявлении будет фактически ссылаться на __imp__func1()
.
Вы можете обойти весь этот механизм вообще и позвонить LoadLibrary
и GetProcAddress
, чтобы получить адрес func1
во время выполнения. Это будет иметь тот же эффект.
Это зависит от компилятора (компоновщика) и платформы, которую вы используете.
I.e. в ОС Windows общая библиотека обычно является файлом .DLL,
, если вы хотите установить ссылку на него (кроме динамической загрузки и разрешения его символов во время выполнения), вам нужен соответствующий .LIB-файл, то есть заглушка ,
В основном библиотека заглушки статическая библиотека, которая повторно отображает все символы, экспортируемые DLL (с __declspec(dllexport)
) до символов, присутствующих в заглушке и которые могут быть найдены и статически скомпонованных в вашей программе с помощью __declspec(dllimport)
.
Так __declspec (dllexport) функция из Windows API или это инструкция, которая находится в Visual Studio? –
@ Daniel Nyman: «__declspec» - это ключевое слово (насколько я знаю, для Visual Studio), «dllexport» и «dllimport» являются атрибутами этого ключевого слова. См. Больше: https://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx – roalz
[__declspec] (https://msdn.microsoft.com/en-us/library/dabb5z75.aspx) - это ключевое слово, которое назначает атрибут класса хранения для Microsoft. – IInspectable
- 1. Как работают библиотеки импорта и почему они не нужны MinGW?
- 2. Сложность импорта библиотеки Java
- 3. Как работают внешние библиотеки
- 4. Как отключить генерацию библиотеки импорта?
- 5. Android: библиотеки импорта Как PhotoView
- 6. Ионные 2 библиотеки импорта
- 7. Ошибка импорта библиотеки PIL
- 8. Как узнать, как работают библиотеки?
- 9. импорта библиотеки в питоне
- 10. Необходимые библиотеки импорта
- 11. Dart ярлыки импорта библиотеки
- 12. Как работают библиотеки с классами?
- 13. Как работают библиотеки при связывании?
- 14. Конфигурация импорта библиотеки библиотеки Python GPSD
- 15. Ошибка импорта библиотеки библиотеки Studio Studio
- 16. импорта «модуль», как моды не работают
- 17. Как работают операции импорта в ember-cli?
- 18. библиотеки импорта директива в AngularJS
- 19. Пакеты импорта дротиков не работают
- 20. импорта библиотеки PHP в CakePHP
- 21. Создание библиотеки импорта не работает
- 22. ошибка библиотеки импорта PPTX питон
- 23. Ошибка импорта проекта библиотеки Zxing
- 24. Какова цель библиотеки импорта Direct3D?
- 25. Ошибка импорта библиотеки Python PyTorrent
- 26. Android - как работают сторонние библиотеки для статистики
- 27. Как работают фреймворки/библиотеки ведения журнала?
- 28. Как работают все эти библиотеки JavaScript OpenID?
- 29. Функция импорта из стандартной библиотеки после импорта аналогично названной функции из другой библиотеки
- 30. библиотеки eclipse больше не работают
См. Также https://msdn.microsoft.com/en-us/magazine/bb985992.aspx –
Исполняемый файл не знает об этом. Это компоновщик, который делает, и он испускает соответствующий код. – IInspectable