Программа статически связана с библиотекой, но для запуска все еще требуется dll
Есть вещи, которые я не понимаю, когда дело доходит до ссылок... Я пишу программу с использованием сторонней библиотеки (библиотеки GEOS). Эта программа зависит от geos.lib, но для запуска все еще требуется geos.dll.
Я прочитал этот вопрос, мне кажется, я понимаю разницу между статическими и динамическими библиотеками. Чего я не понимаю, так это того, почему мне все еще нужна DLL, когда я статически связываю библиотеку.
5 ответов
Это не статически связано..Lib - это просто библиотека-заглушка, которая связывается с DLL в Windows. То есть, вы связываете с.lib во время компиляции, а затем во время выполнения он будет искать.dll.
В Windows есть 3 вида библиотек:
- библиотека объектов (*.lib)
- библиотека импорта (*.lib)
- динамическая библиотека (*.dll)
библиотеки объектов статически связаны. Они содержат полные определения объектов кода, абстрагируемого библиотекой.
Импорт библиотек - это особая форма библиотеки объектов. Вместо того, чтобы содержать код, они содержат информацию для компоновщика, который в конечном итоге отображает исполняемый файл в библиотеку динамической компоновки.
библиотеки динамических ссылок, такие как библиотеки объектов, предоставляют код для вашей программы. Однако этот код загружается во время выполнения и не компилируется в ваш исполняемый файл.
Вам не всегда нужно связывать библиотеку импорта. Вместо этого вы можете вызвать LoadLibrary() и найти точки входа API по имени или порядковому номеру. (Вы всегда должны сообщать коду, какую DLL и где в API этой DLL вы хотите ввести.)
Другие комментарии здесь верны в том, что вы не можете превратить DLL в статическую библиотеку, не перекомпилировав код для библиотеки - это другой тип вывода.
Если.lib был создан Visual Studio, то проверьте значение свойств проекта -> компоновщик -> ввод -> файл определения модуля. Если он не пустой, то link.exe создает библиотеку-заглушку вместо статической библиотеки, даже если в свойствах проекта -> Общие -> Тип конфигурации "Статическая библиотека (.lib)".
Вы можете статически связать файл lib, если и только если это статический файл lib. Итак, сначала вам нужно преобразовать проект вашей dll в статическую библиотеку, собрать ее, а после этого использовать продукт вашей сборки, который будет представлять собой статический файл.lib.
Вы определенно ссылаетесь на динамическую библиотеку. То, что для компоновщика требуется файл.lib, не означает, что вы ссылаетесь на статическую библиотеку.