Qt / mingw32 неопределенные справочные ошибки не могут связать .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'

Кто-нибудь может помочь, пожалуйста?


person Community    schedule 16.07.2009    source источник
comment
Не могли бы вы выложить про файл, который вы используете?   -  person Jesse Vogt    schedule 16.07.2009
comment
просто добавил содержимое файла pro в исходное сообщение.   -  person    schedule 16.07.2009


Ответы (3)


На основании вопроса Использовать библиотеки скомпилировано с помощью Visual Studio в приложении, скомпилированном g ++ (mingw) и сообщением на форуме MSDN Я не могу смешивать VC и GCC, похоже, вы не можете связать приложение gcc с визуальными скомпилированными библиотеками C ++.

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

person Jesse Vogt    schedule 16.07.2009
comment
На самом деле это то, что я собирался опубликовать, я обнаружил следующее: эти библиотеки, как и многие другие предварительно скомпилированные пакеты разработки Windows, такие как клиентская библиотека MySQL, были скомпилированы с помощью Ms Visual C ++ (MSVC). Мы обнаружили, что MSVC и MinGW используют разные соглашения об именах для функций stdcall. MSVC экспортирует их как _name @ ordinal, но MinGW экспортирует их как name. В результате сборка MinGW завершилась неудачно с ошибками ссылки «неопределенные ссылки» при вызове функций stdcall, экспортированных из библиотеки MSVC. - person ; 16.07.2009
comment
Найдите решения здесь: blog.outofhanwell .com / 2006/05/01 / - person ; 16.07.2009

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

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

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

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

Это сработало! Для компиляции проекта вам необходимо просто:

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

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

person Community    schedule 16.07.2009
comment
В настоящее время я пробую плагин Visual Studio для QT, чтобы попытаться создать приложения QT и использовать компилятор VS (и использовать мои MSVC .libs) - person ; 16.07.2009

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

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

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

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

Пробовал пока:

  • Не опечатка, d добавлено в библиотеку
  • Использование расширения lib правильно, как видно на выходе
person Jesse Vogt    schedule 16.07.2009
comment
d - это фактическое имя, d добавляется для отладочной версии .lib - person ; 16.07.2009
comment
@xcimo имеет смысл ... просто хотел проверить - person Jesse Vogt; 16.07.2009
comment
Я не знаю, экспортируется ли класс MessageBuffer. У меня нет ключевого слова export в классе messageBuffer, так как я смог использовать эту библиотеку во многих других проектах Visual Studio c ++. Нужен ли экспорт статической библиотеке? или, может быть, это то, что нужно mingw? Спасибо за помощь. - person ; 16.07.2009
comment
Если честно, не уверен, нужно ли это ... но ошибка вроде подразумевает, что их нельзя найти. - person Jesse Vogt; 16.07.2009
comment
как вы думаете, он не может найти .h или .lib? - person ; 16.07.2009
comment
Попробуйте использовать команду nm, поставляемую с minigw, чтобы увидеть, что экспортируется вашей библиотекой. - person Jesse Vogt; 16.07.2009
comment
Если вы еще не пробовали, прикрепите -l перед библиотекой в ​​файле pro - person Jesse Vogt; 16.07.2009