Почему я получаю пропущенную ошибку DLL после соединения с .lib? - PullRequest
4 голосов
/ 20 марта 2012

Я работаю над этой программой для Windows с 1999 года. Мне не удалось собрать ее в Visual Studio, поскольку она постоянно выдала мне ошибки компоновщика о пропущенных символах.Затем мой коллега сказал мне попробовать взять файлы .lib из исходного проекта и указать их как дополнительные зависимости ссылок.Я сделал это, и программа связалась нормально.Когда я пытался запустить его, он жаловался на отсутствие файлов DLL.Итак, я нашел существующую копию программы Windows, запущенной на каком-то старом компьютере, скопировал файлы dll, и моя сборка начала работать!Это был самый счастливый день в моей жизни, но я не совсем знаю, что случилось.

Кто-нибудь может кратко объяснить, что такое lib-файлы в Windows и как они связаны с dll?

Ответы [ 2 ]

5 голосов
/ 20 марта 2012

Существует два варианта использования файлов .LIB в Windows.Кен упоминает одну из них, которая предназначена для статического связывания, но есть и другое применение, которое называется import library, и это то, что у вас здесь есть.Если вы создаете .DLL самостоятельно, у вас есть возможность создать для него библиотеку импорта.В результате вы можете просто ссылаться на файл .LIB, как если бы вы использовали обычную статическую библиотеку, но на самом деле .LIB просто содержит шаблонный код для загрузки точек входа из DLL.

Причина, по которой это полезно, заключается в том, что вам может потребоваться распространять код как dll (например, чтобы вы могли обновить его независимо от основного приложения или предоставить dll в качестве плагина), но это облегчает привязку к приложению, поскольку .LIBобрабатывает вызовы LoadLibrary() и GetProcAddress(), так что вам не нужно.Он также может загружать определения классов из DLL, чего вы не можете сделать с GetProcAddress() самостоятельно.

Подробнее о MSDN

0 голосов
/ 20 марта 2012

.LIB (библиотека) - это наборы скомпилированных исходных файлов (объектных файлов), которые вы можете связать в своем приложении для обеспечения функциональности.Связывание делает объектные файлы частью вашего исполняемого файла.Обычно это называется static linking, и именно поэтому вы получили ошибку времени компиляции из-за пропущенных символов;файлы библиотеки не были доступны для извлечения необходимого объектного кода, чтобы добавить его в ваше приложение.

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

Некоторые IDE (такие как VisualStudio C / C ++) делает доступными как статический файл .LIB, так и версию .DLL, так что вы можете выбрать, чтобы библиотеки времени выполнения были связаны непосредственно с вашим приложением или чтобы они были доступны для динамической загрузки во время выполнения.(Второе полезно, например, если у вас есть несколько приложений, которые вы разработали; вы можете использовать динамическую версию MSVCRTL, чтобы резко уменьшить размер ваших исполняемых файлов, раздельно распределяя RTL вместо того, чтобы связывать их с каждым приложением.

...