Построение .dll-файла и промежуточного .lib

Ниже приводится выдержка из link1.

Microsoft представила __export в 16-разрядной версии компилятора Visual
C ++, чтобы компилятор мог автоматически генерировать имена экспорта
и поместите их в файл .lib. Этот файл .lib может быть использован только
как статический .lib для связи с DLL. В новых версиях компилятора вы
может экспортировать данные, функции, классы или функции-члены класса из
DLL с использованием ключевого слова __declspec (dllexport). __declspec (dllexport)
добавляет директиву экспорта в объектный файл, поэтому вам не нужно использовать
файл .def.

Я понимаю параграф выше, но не очень хорошо.

Ниже приводится выдержка из link2.

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

Это смущает меня и заставляет задавать следующие вопросы:

  1. Может ли кто-нибудь, простыми словами, сказать мне, что термин экспорт
    действительно значит? Я считаю, что это делает объект доступным из одного
    кусок кода другому — но эй !!

  2. При сборке проектов со старыми библиотеками, я вижу файл .def в большинстве
    из них. Но последние компиляторы автоматически экспортируют объекты. Было бы
    Наличие .def файла вызывает конфликт при конвертации старого
    версия визуального студийного проекта на новый?

  3. Какая польза от .lib (так называемый файл импорта) после генерации
    .dll. Это можно безопасно удалить?

  4. ARRGGGH !! В чем разница между статической библиотекой (.lib) и библиотекой импорта (.lib)? Ошибка, а? Но до сих пор !!

  5. Является ли Windows специфическим явлением? Я считаю, что это не так. Что является аналогом Linux для так называемого файла импорта?

Пожалуйста, не стесняйтесь перефразировать вопрос, если он еще не ясен.

-1

Решение

скажите, что на самом деле означает термин экспорт?

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

Я вижу файл .def в большинстве из них

Может быть очень старые проекты. Или он просто не был запущен как проект, который должен был создать отдельный модуль. Как статическая библиотека, поэтому исходный код не имеет __declspec атрибутов. Кроссплатформенные библиотеки, вероятно, подойдут для этого Спецификации языка C и C ++ до сих пор не имеют возможности создавать модули стандартизированным способом. Все делают это, никто не делает это одинаково. Массивная утечка времени.

Какая польза от .lib (так называемый файл импорта)

В проекте необходимо, чтобы использования DLL. Компоновщик должен знать, что идентификатор находится в другом здании и не может быть разрешен во время ссылки. Он помещает запись в другую таблицу, которую использует загрузчик операционной системы, в таблицу импорта. Это очень простой файл, это просто список имен экспортируемых идентификаторов. Теоретически сама DLL может быть использована компоновщиком для выяснения этого. Практически это не работает, потому что экспортированное имя не должно совпадать с реальным именем.

В чем разница между статической библиотекой (.lib) и библиотекой импорта (.lib)

Статическая библиотека содержит код, который связан с проектом, который использует библиотеку. Библиотека импорта не содержит код, просто намек на то, что код доступен в другом месте.

Является ли Windows специфическим явлением?

Примерно да. Unixes имеют ту же концепцию, но реализуют ее совершенно по-разному.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]