Зачем некоторым DLL файлам нужен дополнительный .lib файл для связи?
У меня есть вопрос о связывании библиотек и .lib файлах...
это контекст:
Я создал DLL: MyLib.dll.
Чтобы использовать эту библиотеку в моем проекте QT, мне нужно включить путь включения, ссылку на библиотеку и использовать файлы заголовков:
LIBS += "C:\myPath\MyLib.dll"
INCLUDEPATH += "C:\myPath"
HEADERS += \
../myPath/MyLib_global.h \
../myPath/mylib.h
Я использую стороннюю dll в своем проекте: third.dll
Если я делаю то же, что и в приведенном выше примере, это не работает:
LIBS += "C:\myPath\third.dll"
В стороннюю DLL входит файл .lib "third.lib", который, по-видимому, мне нужно использовать вместе с DLL.
Почему? Зачем некоторым библиотекам DLL нужен .lib файл, но библиотеки DLL нет?
Может ли быть .lib является статической библиотекой, обращающейся к DLL?
Спасибо большое!
Ответы
Ответ 1
Файл lib является файлом библиотеки импорта, который позволяет окончательному исполняемому файлу содержать таблицу адресов импорта (IAT), на которую ссылаются все вызовы функций DLL. В принципе, позволяя просматривать функции.
Вы можете прочитать об этом здесь.
Чтобы Qt сгенерировал lib, добавьте его в .pro: -
CONFIG+= staticlib
Вот какая-то документация о том, как создавать библиотеки.
Ответ 2
Мой ответ может быть не конкретным для контекста, но будет полезен большинству разработчиков, задающих тот же вопрос. На это ответил Энтони Уильямс
Что находится внутри .lib файла Static-библиотеки, статически связанной динамической библиотеки и динамически связанной динамической библиотеки?
Для использования динамической библиотеки вам не нужен .lib файл, но без него вы не можете рассматривать функции из DLL как обычные функции в вашем код. Вместо этого вы должны вручную вызвать LoadLibrary для загрузки DLL (и FreeLibrary, когда вы закончите) и GetProcAddress, чтобы получить адрес функции или элемента данных в DLL. Затем вы должны бросить возвращенный адрес к соответствующему указателю на функцию, чтобы используйте его.