Подтвердить что ты не робот

Ссылки:.a,.lib и .def файлы

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

В статических библиотеках Linux есть расширение файла .a. Статические библиотеки в Windows имеют расширение файла .lib. Динамические библиотеки в Windows имеют расширение .dll; для связи с DLL требуется библиотека импорта. Библиотека импорта представляет собой статическую библиотеку. Он содержит код, необходимый для загрузки DLL. Теперь вы используете GCC (не cl.exe) для компиляции в Windows. GCC имеет другое соглашение о расширении файла для библиотек импорта, его следует называть *.dll.a или *.a ", как описано в doc для --out-implib, о котором вы говорили.

Библиотеки импорта (.lib с MSVC или .dll.a с GCC) являются статическими библиотеками: они содержат код для загрузки DLL. У меня был тот же вопрос на днях.

В DLL могут быть экспортированные функции и функции, которые не экспортируются. Библиотека импорта должна знать, какие функции экспортированы, а какие нет. Одним из способов сказать это файл DEF.

При создании библиотеки DLL используется компоновщик файл .def для создания экспорта (.exp) и библиотеку импорта (.lib). Затем компоновщик использует экспортировать файл для создания DLL файла. Исполняемые файлы, которые неявно ссылаются на ссылка DLL на библиотеку импорта когда они построены. - MSDN: экспорт из DLL с использованием файлов DEF

Также см. MSDN: экспорт функций из DLL по оригиналу, а не по имени, вместе, чтобы ответить на ваш последний вопрос об экспорте по индексу, или порядковый номер.