Ошибка компоновщика Qt на HWND, HDC - PullRequest
1 голос
/ 06 апреля 2011

Я включил windows.h. Это даже хорошо работает, если я просто закомментирую HWND, HDC, HBITMAP, GetBitmapBits() и т. Д. Я думаю, мне нужно включить правильную LIB ?? какую LIB включить? Это -lgdi32 ??

Сообщение об ошибке: :: error: collect2: ld returned 1 exit status

EDIT после добавления LIBS += -lgdi32 не было ошибки компоновщика, и он успешно скомпилирован. Так что это решено, я думаю !!!! или это?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2011

Даже если у вас есть решение для редактирования вашего вопроса, я думаю, что было бы полезно проиллюстрировать, как вы можете решить подобные проблемы в будущем.

Когда компоновщик выдает ошибку, это, вероятно, означает, что вы пытаетесь сослаться на фрагмент исполняемого кода, который он не может найти. Над строкой, которую вы указали, должна была быть серия ошибок, в которых указано, какие именно функции вызывали проблему, например:

foo.obj: ошибка LNK2019: неразрешенный внешний символ _GetBitmapBits @ 12, указанный в функции ...

Вывод может немного отличаться для вашего конкретного компоновщика. Вероятно, он будет включать фразу «неразрешенный внешний». Эти ошибки и есть то, о чем @ Friend-Pal на самом деле просил.

Когда вы получаете неразрешенную внешнюю ссылку, вы исправляете ее, связываясь с соответствующей библиотекой. Чтобы определить, какую библиотеку для какой функции включить, обратитесь к документации. Например, документация для GetBitmapBits указывает внизу:

Минимально поддерживаемый клиент: Windows 2000 Professional
Минимальный поддерживаемый сервер: Windows 2000 Server
Заголовок: Wingdi.h (включая Windows.h)
Библиотека: Gdi32.lib
DLL: Gdi32.dll

Способ добавления ссылки на библиотеку зависит от используемого вами компоновщика. В вашем случае, исходя из правки вашего вопроса, это должно быть -lgdi32 для ссылки в библиотеке gdi32.lib.

Повторяйте этот процесс, пока все ссылки не будут разрешены.

Для типов данных (HWND, HDC, HBITMAP и т. Д.) Требуется только соответствующий заголовочный файл; с ними не связано никакого реального исполняемого кода, поэтому они не влияют на компоновщик.

0 голосов
/ 21 марта 2014

В дополнение к ответу Тадмаса о поиске MSDN, чтобы узнать, какая библиотека вам нужна, при использовании Qt вы можете определять библиотеки без внесения изменений в флаги компоновщика и т. Д.

  • Если вы используете компилятор Microsoft, достаточно добавить, например, строку LIBS += Gdi32.lib в файл .pro. Готово!

  • Если вы используете GCC, вы должны указать полный путь к файлу lib, например, LIBS += "C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Lib/Gdi32.lib".

  • Если у вас есть проект, предназначенный как для 32-битных, так и для 64-битных сборок GCC (и вы собрали Qt с 64-битной GCC в Windows), вы должны использовать условные области в файле .pro для определяет, что вы собираете для 32-битной или 64-битной и указываете путь к 64-битному файлу lib в 64-битных сборках. например:

    win32-g++:!contains(QMAKE_HOST.arch, x86_64) {
        LIBS += "C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Lib/Gdi32.lib"
    } else {
        LIBS += "C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Lib/x64/Gdi32.lib"
    }
    
...