Как EXE может иметь статическую зависимость от DLL? - PullRequest
1 голос
/ 09 февраля 2011

Часто при попытке запустить EXE-файл, который использует DLL, если DLL отсутствует, вы получаете стандартную ошибку Windows:

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

Похоже, что она встроена в EXE до того, как будет вызван любой ваш код ... как он работает и как это настраиваетсяпри создании проекта в Visual Studio?

edit:

В моем конкретном сценарии у меня фактически есть DLL, которая имеет «статические» зависимости от других DLL, поэтому, если их нет, регистрация моей DLL не выполняется, что довольно сложнодиагностировать.Но я бы предпочел не перечислять вручную используемые функции DLL, так как их много!

1 Ответ

7 голосов
/ 09 февраля 2011

Когда вы ссылаетесь на DLL, есть два способа сделать это: неявное и явное.То, с чем вы сталкиваетесь, - это ошибка неявного связывания.

Неявное связывание работает через то, что называется таблицей импорта, содержащейся в исполняемом образе, который использует формат PE (Portable Executable).Формат PE определяет таблицы импорта и экспорта.Таблица экспорта содержит список функций, экспортируемых DLL, и их точки входа.Таблица импорта содержит неявные зависимости от других модулей.

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

Компоновщик сгенерирует таблицу импорта.В C ++ это обычно делается через файл .lib для этой DLL.

Явное связывание - это когда ваш код вызывает LoadLibrary и GetProcAddress для загрузки DLL и ее функций.Обычно этот подход используется, когда вы хотите написать приложение, которое может работать в разных системах.Например, вы можете захотеть использовать определенные функции, которые присутствуют только в определенных версиях ОС, но при работе в более старой версии ОС переходят на другое поведение.

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

Статья MSDN по этой теме объясняет все это и многое другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...