Я могу подробнее рассказать о библиотеках DLL в Windows, чтобы помочь разъяснить эти загадки моим друзьям здесь, в * NIX-стране ...
DLL похожа на файл общего объекта. Оба изображения являются готовыми для загрузки в память загрузчиком программы соответствующей ОС. Изображения сопровождаются различными битами метаданных, которые помогают компоновщикам и загрузчикам создавать необходимые ассоциации и использовать библиотеку кода.
Windows DLL имеют таблицу экспорта. Экспорт может быть по имени или по позиции таблицы (числовой). Последний метод считается «старой школой» и является гораздо более хрупким - перестройка DLL и изменение положения функции в таблице приведут к катастрофе, в то время как нет реальной проблемы, если связывание точек входа осуществляется по имени. Поэтому забудьте об этом как о проблеме, но имейте в виду, что она есть, если вы работаете с кодом «динозавров», таким как сторонние библиотеки поставщиков.
DLL-библиотеки Windows создаются путем компиляции и компоновки, как если бы вы работали с EXE (исполняемым приложением), но DLL не должна быть автономной, точно так же, как SO предназначен для использования приложением либо через динамический загрузка или с помощью привязки по времени соединения (ссылка на SO встроена в метаданные двоичного файла приложения, и загрузчик программы ОС автоматически загрузит ссылочные SO). DLL могут ссылаться на другие DLL так же, как SO могут ссылаться на другие SO.
В Windows библиотеки DLL будут предоставлять доступ только к определенным точкам входа. Это называется «экспорт». Разработчик может либо использовать специальное ключевое слово компилятора, чтобы сделать символ видимым извне (для других компоновщиков и динамического загрузчика), либо экспорт может быть указан в файле определения модуля, который используется во время компоновки, когда сама библиотека DLL создается Современная практика заключается в украшении определения функции ключевым словом для экспорта имени символа. Также можно создавать заголовочные файлы с ключевыми словами, которые будут объявлять этот символ как импортируемый из DLL вне текущей единицы компиляции. Найдите ключевые слова __declspec (dllexport) и __declspec (dllimport) для получения дополнительной информации.
Одной из интересных особенностей библиотек DLL является то, что они могут объявлять стандартную функцию-обработчик «при загрузке / выгрузке». Всякий раз, когда DLL загружается или выгружается, DLL может выполнить некоторую инициализацию или очистку, в зависимости от обстоятельств. Это прекрасно сочетается с наличием библиотеки DLL в качестве объектно-ориентированного менеджера ресурсов, такого как драйвер устройства или интерфейс общего объекта.
Когда разработчик хочет использовать уже созданную DLL, он должен либо ссылаться на «экспортную библиотеку» (* .LIB), созданную разработчиком DLL при создании DLL, либо он должен явно загружать DLL во время выполнения и запрашивать адрес точки входа по имени с помощью механизмов LoadLibrary () и GetProcAddress (). В большинстве случаев связывание с файлом LIB (который просто содержит метаданные компоновщика для экспортированных точек входа DLL) - это способ использования библиотек DLL. Динамическая загрузка обычно зарезервирована для реализации «полиморфизма» или «конфигурируемости во время выполнения» в поведении программ (доступ к надстройкам или определенным позднее функциям, также называемым «плагинами»).
Порядок действий в Windows иногда может вызывать некоторую путаницу; система использует расширение .LIB для ссылки как на обычные статические библиотеки (архивы, такие как файлы POSIX * .a), так и на библиотеки «экспорта-заглушки», необходимые для привязки приложения к DLL во время соединения. Таким образом, следует всегда проверять, имеет ли файл * .LIB файл с таким же именем * .DLL; в противном случае велика вероятность, что файл * .LIB является статическим архивом библиотеки, а не экспортирует метаданные привязки для DLL.