Qt/mingw32 undefined ссылочные ошибки... невозможно связать .lib

Я новичок в Qt и имею одну ошибку, которую я не могу исправить.

У меня есть куча файлов статической библиотеки windows (VS2005) (.lib). И я тестирую, хорошо ли они работают с Qt. Поэтому я взял самую простую библиотеку, которую у меня есть. (Вызывается MessageBuffer).

Итак, я добавил MessageBuffer.h в main.cpp и добавил расположение этих файлов в INCLUDEPATH .pro.

До тех пор все кажется прекрасным, я могу использовать класс и Qt IDE показать весь метод и все такое. Так что мне кажется, что он нашел файл .h.

Теперь я добавил MessageBuffer.lib (VS2005/Debug build) в .pro следующим образом:

LIBS += E:/SharedLibrary/lib/MessageBufferd.lib

Я также пробовал следующее:

win32:LIBS += E:/SharedLibrary/lib/MessageBufferd.lib
LIBS += -LE:/SharedLibrary/lib -lMessageBufferd
win32:LIBS += -LE:/SharedLibrary/lib -lMessageBufferd

Вот содержимое моего файла .pro:

QT += opengl
TARGET = SilverEye
TEMPLATE = app
INCLUDEPATH += E:/SharedLibrary/MessageBuffer
SOURCES += main.cpp \
    silvereye.cpp
HEADERS += silvereye.h
FORMS += silvereye.ui
OTHER_FILES += 
win32:LIBS += E:/SharedLibrary/lib/MessageBufferd.lib

Все они дают мне те же ошибки: (и я получаю то же самое, даже если я не включаю .lib)

Running build steps for project SilverEye...
Configuration unchanged, skipping QMake step.
Starting: C:/Qt/2009.03/mingw/bin/mingw32-make.exe -w 
mingw32-make: Entering directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye'
C:/Qt/2009.03/mingw/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye'
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\SilverEye.exe debug/main.o debug/silvereye.o debug/moc_silvereye.o -L"c:\Qt\2009.03\qt\lib" -lopengl32 -lglu32 -lgdi32 -luser32 -lmingw32 -lqtmaind E:/SharedLibrary/lib/MessageBufferd.lib -lQtOpenGLd4 -lQtGuid4 -lQtCored4
mingw32-make[1]: Leaving directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye'
mingw32-make: Leaving directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye'
debug/main.o: In function `Z5qMainiPPc':
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:12: undefined reference to `MessageBuffer::MessageBuffer()'
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:13: undefined reference to `MessageBuffer::Append(char*, int)'
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:17: undefined reference to `MessageBuffer::~MessageBuffer()'
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:17: undefined reference to `MessageBuffer::~MessageBuffer()'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\SilverEye.exe] Error 1
mingw32-make: *** [debug] Error 2
Exited with code 2.
Error while building project SilverEye
When executing build step 'Make'

Может ли кто-нибудь помочь?

Ответы

Ответ 1

Исходя из вопроса Использовать библиотеки, скомпилированные с визуальной студией, в приложении, составленном g++ (mingw) и на форуме форума MSDN Я не могу смешивать VC и GCC, он не отображается, вы можете связать приложение gcc с visual С++ скомпилированными библиотеками.

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

Ответ 2

В FAQ MinGW обсуждаются проблемы и предлагается решение:

  • Создайте файл определения, используя reimp (для файлов lib) или pexports (для файлов dll).
  • Удалить префиксы подчеркивания из функций stdcall.
  • Используйте dlltool для преобразования библиотеки MSVC в библиотеку MinGW с новым определением.

Это не сработало. Наконец, мы удалили ординалы из имен функций, которые заставили его скомпилировать. Но программа не запускалась, потому что не могла найти связанные функции в DLL. Наконец, после консультаций с документацией MSDN для файлов определений мы изменили инструкции сборки:

  • Создайте файл определения с помощью reimp.
  • Для каждой функции stdcall (отформатированной как _name @ordinal) добавьте имя строки = _name @ordinal, позволяя MinGW сопоставлять свое соглашение об именах stdcall с протоколом MSVC.
  • Используйте dlltool для преобразования библиотеки MSVC в библиотеку MinGW с новым определением.

Это сработало! Чтобы скомпилировать проект, вы должны просто:

  • Загрузите и установите пакет Qt/Windows, который включает в себя MinGW.
  • Загрузите reimp и перетащите его в папку MinGW/bin.
  • Загрузите пакеты разработки для сторонних библиотек и укажите переменную окружения в это место.
  • Создайте проект с помощью обычных команд qmake/make.

Взято из: http://blog.outofhanwell.com/2006/05/01/linking-msvc-libraries-with-mingw-projects/

Ответ 3

Я предполагаю, что вы использовали библиотеку MessageBuffer в другом приложении с проблемами. Ошибка выглядит так: либо она не может найти библиотеку, либо класс MessageBuffer не экспортируется.

Вы пытались помещать -l перед библиотекой в ​​файл pro?

win32:LIBS += -lE:/SharedLibrary/lib/MessageBufferd.lib

См. мой ответ . Я добавил другой ответ, потому что я не хотел, чтобы этот ответ был более грязным, чем это было.

Пробовал до сих пор:

  • Не опечатка, d добавляется в библиотеку
  • Использование расширения lib правильное, как показано на выходе