Подтвердить что ты не робот

Зачем некоторым DLL файлам нужен дополнительный .lib файл для связи?

У меня есть вопрос о связывании библиотек и .lib файлах...

это контекст:

  • ОС = Windows
  • IDE = QT

Я создал 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?

Спасибо большое!

4b9b3361

Ответ 1

Файл lib является файлом библиотеки импорта, который позволяет окончательному исполняемому файлу содержать таблицу адресов импорта (IAT), на которую ссылаются все вызовы функций DLL. В принципе, позволяя просматривать функции.

Вы можете прочитать об этом здесь.

Чтобы Qt сгенерировал lib, добавьте его в .pro: -

CONFIG+= staticlib

Вот какая-то документация о том, как создавать библиотеки.

Ответ 2

Мой ответ может быть не конкретным для контекста, но будет полезен большинству разработчиков, задающих тот же вопрос. На это ответил Энтони Уильямс

Что находится внутри .lib файла Static-библиотеки, статически связанной динамической библиотеки и динамически связанной динамической библиотеки?

Для использования динамической библиотеки вам не нужен .lib файл, но без него вы не можете рассматривать функции из DLL как обычные функции в вашем код. Вместо этого вы должны вручную вызвать LoadLibrary для загрузки DLL (и FreeLibrary, когда вы закончите) и GetProcAddress, чтобы получить адрес функции или элемента данных в DLL. Затем вы должны бросить возвращенный адрес к соответствующему указателю на функцию, чтобы используйте его.