Почему Qt Creator может правильно связать dll без .lib и LoadLibrary ()?

Обычно, когда мы ссылаемся на dll, мы также должны использовать .lib, чтобы компоновщик мог сказать, что это динамическое связывание. Однако в Qt Creator мы можем сделать это без него.

Я следовал инструкции на YouTube, и я просто процесс следующим образом:

  1. Подготовил TestMessagePack.dll, скомпилированный GCC;
  2. Скопируйте DLL в папку отладки, в которой находится исполняемый файл.
  3. добавьте приведенные ниже коды, которые также указывают, где находятся включаемые файлы.
INCLUDEPATH += "C:Users***DesktopBrand NewCMakeStuffincludeqmsgpack"

LIBS += "C:Users***DesktopBrand NewCMakeStuffinTestMessagePack.dll"
  1. построить и запустить.

Без шага 2 компоновщик потерпит неудачу. Это очевидно, что Qt Creator может ссылаться на dll без .lib. Но как компоновщик может узнать без файла .lib?

Мне нужно знать принцип внутри

Всего 1 ответ


Вы используете один из различных MinGW ?? Порты Windows GCC. В Windows компоновщик ( ld ) цепочки инструментов GCC поддерживает прямое связывание библиотек DLL, в отличие от компоновщика Microsoft, для которого требуется библиотека импорта прокси- .lib . Документация :

прямая ссылка на dll

Порты cygwin / mingw ld поддерживают прямую связь, включая символы данных, с dll без использования каких-либо библиотек импорта.

...

И MinGW: укажите библиотеки для компоновщика

MinGW поддерживает библиотеки, названные в соответствии с соглашениями ".lib" и ".dll", в дополнение к обычному соглашению "lib.a", распространенному в системах * nix.

...

Это поведение дается MingGW ?? линкер, который вы используете. Это означает, что связывание динамических библиотек с ld может быть выполнено таким же образом в Windows, как и в Unix-подобных ОС, где не существует библиотек импорта. Qt не имеет значения.


Есть идеи?

10000