Связывание: файлы .a, .lib и .def

я создаю dll из сборки в Windows, используя GNU binutils.

Я знаю, что dll может быть загружена либо при загрузке исполняемого файла, либо во время выполнения (с использованием LoadLibrary api call).

Для загрузки во время загрузки мне, кажется, нужен только файл dll: никаких файлов .a, .lib или .def не требуется. Мне было интересно, что представляют собой эти форматы файлов и для какой цели они служат.

Что я знаю и некоторые конкретные вопросы:

  • .a - это расширение, обычно используемое для статических библиотек в Unix. Файлы .a создаются с помощью опции - out-implib программы GNU ld. Говорят, что это «импортная библиотека», что достаточно справедливо. Тогда возникает вопрос: «Что хорошего в библиотеке импорта, если она мне не нужна при компоновке?»

  • .lib - это расширение, используемое для статической библиотеки в Windows, и, согласно Википедии, также используется как «импорт библиотека "под окнами, поэтому я сильно подозреваю, что это просто другое название того, что binutils называет .a-файлами. Истина / ложь?

  • На всех страницах я могу найти точки, в которых файлы .def содержат список экспортируемых символов dll. Разве это не похоже на то, что должна делать «библиотека импорта»?

  • Кроме того, я прочитал здесь , что использование файлов .def является альтернативой ручному указанию экспорта в исходном файле (который Я сделал). Но я также помню, как читал (не могу найти обратную ссылку) файл .def, содержащий индекс ( порядковый номер ) в экспортированных символах, что позволяет ускорить загрузку во время выполнения. Так ли это?

29
задан Community 23 May 2017 в 11:54
поделиться