Когда вы ссылаетесь на DLL, есть два способа сделать это: неявное и явное.То, с чем вы сталкиваетесь, - это ошибка неявного связывания.
Неявное связывание работает через то, что называется таблицей импорта, содержащейся в исполняемом образе, который использует формат PE (Portable Executable).Формат PE определяет таблицы импорта и экспорта.Таблица экспорта содержит список функций, экспортируемых DLL, и их точки входа.Таблица импорта содержит неявные зависимости от других модулей.
Когда исполняемый файл запускается, загрузчик читает таблицу импорта, а затем пытается загрузить все упомянутые библиотеки DLL и все функции в этих библиотеках.Это может привести к сбою, если DLL не найдена, если DLL не загружается должным образом или если DLL не содержит ссылочных функций.В вашем случае это происходит сбой, потому что загрузчик не нашел XXX.dll
в пути поиска DLL.
Компоновщик сгенерирует таблицу импорта.В C ++ это обычно делается через файл .lib для этой DLL.
Явное связывание - это когда ваш код вызывает LoadLibrary
и GetProcAddress
для загрузки DLL и ее функций.Обычно этот подход используется, когда вы хотите написать приложение, которое может работать в разных системах.Например, вы можете захотеть использовать определенные функции, которые присутствуют только в определенных версиях ОС, но при работе в более старой версии ОС переходят на другое поведение.
Термин static не следует использовать при ссылке на ссылки на библиотеки DLL.Статическое связывание - это когда реализация функции включена в изображение, а не содержится во внешней библиотеке.
Статья MSDN по этой теме объясняет все это и многое другое.