Хобрук: Ваш путь к мастерству в программировании

Как библиотеки DLL обычно упаковываются с приложениями?

У меня много основных вопросов о библиотеках DLL и о том, как связать сторонние библиотеки с вашим программным обеспечением, но почти все, что я нахожу при поиске, специфично для C # (например, this question), и я ищу более общую информацию о том, как работают библиотеки DLL и каково их назначение.


У меня есть, например, приложение C ++ под управлением CMake, которое ссылается на одну или несколько сторонних библиотек DLL.

Их библиотеки DLL установлены в C:/Program Files/Intel/SomeLibrary/bin/somelibrary.dll. Я могу нормально построить свое приложение, если переменная окружения позаботится о поиске их заголовков.

Очевидно, я не могу запускать свои исполняемые файлы прямо из коробки, потому что somelibrary.dll не может быть найден. Мне нужно либо скопировать его в ту же папку, что и исполняемый файл, либо добавить Intel/SomeLibrary/bin в свой путь.

Вопросы

  1. Как другие программы связываются с необходимыми им библиотеками DLL? Они просто упаковывают копии всех сторонних библиотек DLL, в которых они используются, со своим собственным программным обеспечением?

  2. Это другой процесс для некоторых сторонних библиотек - например, библиотек Intel, которые вы бы включили в свое программное обеспечение, но для Распространяемые компоненты Microsoft VS, требуете ли вы, чтобы пользователь установил их? Похоже, ваш установщик (пример WiX) их устанавливает если они не существуют (и тогда он устанавливает новую копию для каждой части программного обеспечения, которая в них нуждается?).

  3. Могли ли вы потенциально иметь на вашем компьютере много копий одной и той же библиотеки DLL, потому что она была нужна множеству отдельных программ, но не могли узнать, есть ли она у вас где-то уже?

    Другими словами, могут ли две программы, написанные разными людьми, связываться с одним и тем же файлом DLL? Как они находят эту DLL или устанавливают ее, если ее не существует?


Я заранее прошу прощения за любые фундаментальные недоразумения, которые я сделал, задавая эти вопросы - я новичок в идее упаковки уже созданного программного обеспечения.


  • У меня есть 23 библиотеки DLL, упакованные с одним из моих приложений, которые я написал. 10 из которых от Qt, 12 - мои собственные, одна - сторонняя dll. У меня CMake создает установщик на основе NSIS, который упаковывает все необходимые dll и помещает их в одну папку bin. 02.02.2021
  • У меня есть сгенерированный установщик NSIS, который связывает правильный распространяемый пакет Microsoft и устанавливает его по выбору пользователей. 02.02.2021
  • @drescherjm, спасибо - а когда вы разрабатываете это приложение, вы просто добавляете сторонние dll на свой путь? 02.02.2021
  • У меня есть установщик NSIS, созданный CMake, который устанавливает библиотеки DLL в ту же папку, что и исполняемые файлы для моего приложения. Я не проверяю и не полагаюсь на какие-либо установленные в системе библиотеки DLL. Я упаковываю именно те библиотеки DLL, которые нужны моему приложению. 02.02.2021
  • 1. Да, они просто связывают свои библиотеки DLL вместе с исполняемым файлом, за исключением того, что они находятся в папке System32. --- 2. Не уверен в этом, Windows не совсем моя область знаний. Если вы не хотите, чтобы вместе с исполняемым файлом поставлялся комплект DLL, подумайте о статической компоновке. Меньше файлов, но больший exe-файл. --- 3. Да. 02.02.2021

Ответы:


1

Краткий ответ: загрузчик dll будет искать dll в локальной папке приложения, а затем искать во множестве системных расположений. Существуют сложности с манифестами, функцией SafeDllSearchMode (влияет на порядок поиска в каталогах) и разработчиками, загружающими библиотеки DLL из настраиваемых мест путем переопределения (LoadLibraryEx) и некоторыми другими (см. Ниже).

Типы зависимостей. Существует множество типов зависимостей dll: Схема зависимостей модуля / dll.


Динамический- Порядок поиска в библиотеке ссылок: вот выдержка из Документы Microsoft по теме: Система может содержать несколько версий одной и той же библиотеки динамической компоновки (DLL). Приложения могут управлять расположением, из которого загружается DLL, путем указания полного пути или использования другого механизма, такого как манифест.

Другими словами, вы можете 1) загрузить dll из определенного места или 2) позволить ОС найти ее за вас с помощью стандартных механизмов. Параметр реестра "SafeDllSearchMode" влияет на то, когда выполняется поиск в текущем каталоге пользователя. Теперь по умолчанию он включен, но его можно отключить. См. Ссылку выше для получения достоверных сведений. Остерегайтесь изменений ОС и исправлений безопасности - все это может повлиять на этот порядок в будущем.


Q1: всегда используйте среду выполнения, предоставленную для вашей зависимой библиотеки DLL, если она доступна. Не включайте просто несколько dll, если вам это не положено.

Q2: верно, что время выполнения часто сильно различается. Иногда это всего лишь одна или несколько dll, которые вы можете просто установить в свою локальную папку приложения. В других случаях вы устанавливаете среду выполнения, которая устанавливает файлы в соответствующие папки для общего использования. Некоторые среды выполнения поставляются как модули слияния, которые могут объединять файлы в ваш собственный установщик MSI, а некоторые - как отдельные установщики MSI или установщики setup.exe.

Q3: вся идея использования DLL , по сути, заключается в том, чтобы иметь возможность загружать один и тот же двоичный компонент во многие процессы, чтобы иметь возможность обновлять одну dll для устранения проблем у всех потребителей dll, а также совместно использовать их в памяти (что важно в те времена с небольшой памятью). Dll также можно загружать с задержкой - что означает, что они не будут загружаться до тех пор, пока они не понадобятся - во избежание чрезмерного увеличения памяти. Во всяком случае, это идея.


Версия ОС Windows. Порядок поиска (где искать на диске) нужных DLL для загрузки - довольно сложная тема. На то, как механизм загрузчика ОС обнаруживает библиотеки DLL, может влиять ряд факторов, например 1) версия ОС, 2) манифест, 3) жестко запрограммированный измененные пути загрузки (LoadLibraryEx) или 4) dll перенаправляет, и 5) ранее загруженные библиотеки DLL в память (здесь драконы) и т. д.

UWP и .NET: есть также новые разработки в отношении Приложения UWP. Для сборок .NET разрешение снова другое (что вы заявляете), см. Эту статью: Как среда выполнения находит сборки.

WinSxS: манифест - это новая концепция в Windows: в былые времена такого не было бы, и порядок поиска был бы проще, но менее гибким. С появлением манифестов и параллельных сборок Win32 (несколько версий одной и той же библиотеки DLL, установленных в разных версиях) манифест встраивается в исполняемый файл (или добавляется извне) и сообщает двоичному файлу, где искать среду выполнения. dlls - в иерархии папок WinSxS Windows (обычно: C:\Windows\WinSxS), где могут находиться несколько версий одной и той же dll (в разных подпапках).

Большинство сред выполнения Microsoft - в основном все современные - находятся здесь и, следовательно, требуют манифеста, чтобы указать двоичному файлу, какую версию искать и загружать. Есть способы перенаправить и такие манифесты ... Файлы конфигурации издателя и 2. Вздох ... Это можно использовать для принудительного применения определенной новой версии среды выполнения, когда старая нежелательна для использования. Неиспользуемые среды выполнения также могут быть собраны в мусор с помощью способов сжатия папок WinSxS (См. Этот ответ - раздел Очистка / размещение WinSxS на диете) ... Хммм ... Никаких жестких кодовых путей к WinSxS.


Порядок поиска Dll: старый и устаревший инструмент Dependency Walker имеет устаревшее, но очень хорошее описание порядка поиска DLL в его файл справки.

Совет. Обновленная документация по этому поводу: Документы Microsoft: порядок поиска модулей для настольных приложений . Однако, чтобы получить приблизительное представление о порядке поиска, вы можете просто запустить Dependency Walker и выбрать: Options => Configure Module Search Order.... Затем убедитесь, что кнопка Expand не выбрана. То, что вы видите - как бы устаревшее оно ни было - может помочь вспомнить, как работает порядок поиска модулей:

Dependency Walker - порядок поиска модулей


Ссылки:

02.02.2021
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...


© 2024 hobruk.ru, Хобрук: Ваш путь к мастерству в программировании