minGW (g ++) Ошибка связывания с автоматически сгенерированным Makefile QT-qmake в Windows - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь построить простую программу QT с компилятором MinGW.Я хочу в конечном итоге перенести мою программу, разработанную для Linux на QT / C ++, в Windows.Я скачал QT_4.3.5 (это то, что использует моя программа) и MinGW с их сайта.Я считаю, что это 32-битный компилятор.Я использую «cmd» для сборки программы, похожей на ту, которую я создал в Linux.Моя программа показана ниже.

#include <QApplication>
#include <QPushButton>
#include <cstdio>

int main(int argc, char *argv[])   //This should work with QT4?
{
printf("Hello\n");
QApplication app(argc,argv);
QPushButton hello ("Hello world!");
hello.resize(100,30);
hello.show();
return app.exec();
} 

Мне удалось успешно собрать и запустить эту программу в Linux 5.7.Итак, в Windows я создал файл "main.cpp" и использую qmake для создания файла .pro и файла Makefile.Я использую qmake из QT4.3.5.Я использовал "qmake -project" и qmake.Он успешно создал как .pro-файл, так и Makefile в Windows.Но когда я запускаю make, он дает мне «нераспознанную опцию командной строки '-Wl'»

Я считаю, что может быть проблема совместимости с версией qmake и minGW.Соответствующая строка в Makefile:

LFLAGS        =        -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -mthreads -Wl -Wl,-subsystem,windows

Затем я попытался удалить -Wl, и он выдает ошибки, в которых говорится, что не удается найти "-enable-auto-import", "-enable-runtime-pseudo-reloc "," -s "," -sssystem, windos "нет такого файла или каталога.

1) Как мне устранить эту проблему?

2) Стоит ли попробовать версию minGW64?

------------------------------------ Отредактировано -------------------------------------

Я решил протестировать более новую версию QT.Итак, я установил QT 5.6.3 и также использую minGW4.9, поставляемый с QT5.6.3.Я также сам создал файл проекта QT (.pro).

TEMPLATE = app
TARGET = QT_Simple
INCLUDEPATH += .

# Input
SOURCES += main.cpp

LIBS += -L"C:\Qt\Qt5.6.3\5.6.3\mingw49_32\lib" \
 -L"C:\Qt\Qt5.6.3\5.6.3\mingw49_32\lib" \
 -lmingw32 \
 -lqtmain \
 -lQt5Core \
 -lQt5Gui \

Затем я запускаю "qmake", чтобы создать Makefile.Вот соответствующие разделы.Он немного отличается от предыдущего qmake

####### Compiler, tools and options

CC            = gcc
CXX           = g++
DEFINES       = -DUNICODE -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB - 
DQT_NEEDS_QMAIN
CFLAGS        = -pipe -fno-keep-inline-dllexport -O2 -Wall -Wextra 
$(DEFINES)
CXXFLAGS      = -pipe -fno-keep-inline-dllexport -O2 -std=gnu++0x -frtti - 
Wall -Wextra -fexceptions -mthreads $(DEFINES)
INCPATH       = -I. -I. -IC:/Qt/Qt5.6.3/5.6.3/mingw49_32/include - 
IC:/Qt/Qt5.6.3/5.6.3/mingw49_32/include/QtGui - 
IC:/Qt/Qt5.6.3/5.6.3/mingw49_32/include/QtANGLE - 
IC:/Qt/Qt5.6.3/5.6.3/mingw49_32/include/QtCore -Irelease - 
IC:/Qt/Qt5.6.3/5.6.3/mingw49_32/mkspecs/win32-g++ 
LINKER      =        g++
LFLAGS        =        -Wl,-s -Wl,-subsystem,windows -mthreads
LIBS        =        -LC:/Qt/Qt5.6.3/5.6.3/mingw49_32/lib - 
LC:/utils/my_sql/my_sql/lib -LC:/utils/postgresql/pgsql/lib - 
LC:/Qt/Qt5.6.3/5.6.3/mingw49_32/lib -lmingw32 
C:/Qt/Qt5.6.3/5.6.3/mingw49_32/lib/libqtmain.a -lshell32 
C:/Qt/Qt5.6.3/5.6.3/mingw49_32/lib/libQt5Core.a 
C:/Qt/Qt5.6.3/5.6.3/mingw49_32/lib/libQt5Gui.a 
C:/Qt/Qt5.6.3/5.6.3/mingw49_32/lib/libQt5Core.a 
QMAKE         = C:/Qt/Qt5.6.3/5.6.3/mingw49_32/bin/qmake.exe
IDC           = idc
IDL           = midl
...........

Я знаю, что файлы библиотеки находятся в указанных выше каталогах (например, libQt5Core.a, libQt5Gui.a и т. Д.).Но это дает мне неопределенную ошибку ссылки.Я считаю, что компоновщик не может найти файлы.

C:\Users\Administrator\Documents\QT_Test\QT_Simple>mingw32-make
mingw32-make -f Makefile.Release
mingw32-make[1]: Entering directory 'C:/Users/Administrator/Documents/QT_Test/QT_Simple'
g++ -Wl,-s -Wl,-subsystem,windows -mthreads -o release/QT_Simple.exe release/main.o  -LC:/Qt/Qt5.6.3/5.6.3/mingw49_32/lib
 -LC:/utils/my_sql/my_sql/lib -LC:/utils/postgresql/pgsql/lib -LC:/Qt/Qt5.6.3/5.6.3/mingw49_32/lib -lmingw32 
 C:/Qt/Qt5.6.3/5.6.3/mingw49_32/lib/libqtmain.a -lshell32 C:/Qt/Qt5.6.3/5.6.3/mingw49_32/lib/libQt5Core.a 
 C:/Qt/Qt5.6.3/5.6.3/mingw49_32/lib/libQt5Gui.a C:/Qt/Qt5.6.3/5.6.3/mingw49_32/lib/libQt5Core.a

release/main.o:main.cpp:(.text+0x4d): undefined reference to `_imp___ZN12QApplicationC1ERiPPci'
release/main.o:main.cpp:(.text+0x7f): undefined reference to `_imp___ZN11QPushButtonC1ERK7QStringP7QWidget'
release/main.o:main.cpp:(.text+0xb0): undefined reference to `_imp___ZN7QWidget6resizeERK5QSize'
release/main.o:main.cpp:(.text+0xbc): undefined reference to `_imp___ZN7QWidget4showEv'
release/main.o:main.cpp:(.text+0xc2): undefined reference to `_imp___ZN12QApplication4execEv'
release/main.o:main.cpp:(.text+0xcd): undefined reference to `_imp___ZN11QPushButtonD1Ev'
release/main.o:main.cpp:(.text+0xd6): undefined reference to `_imp___ZN12QApplicationD1Ev'
release/main.o:main.cpp:(.text+0x120): undefined reference to `_imp___ZN12QApplicationD1Ev'
release/main.o:main.cpp:(.text+0x155): undefined reference to `_imp___ZN11QPushButtonD1Ev'
C:/Qt/Qt5.6.3/Tools/mingw492_32/bin/../lib/gcc/i686-w64-mingw32/4.9.2/../../../../i686-w64-mingw32/bin/ld.exe: release/main.o: 
bad reloc address 0x20 in section `.eh_frame'
C:/Qt/Qt5.6.3/Tools/mingw492_32/bin/../lib/gcc/i686-w64-mingw32/4.9.2/../../../.
./i686-w64-mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
Makefile.Release:61: recipe for target 'release/QT_Simple.exe' failed
mingw32-make[1]: *** [release/QT_Simple.exe] Error 1
mingw32-make[1]: Leaving directory 'C:/Users/Administrator/Documents/QT_Test/QT_Simple'
makefile:34: recipe for target 'release' failed
mingw32-make: *** [release] Error 2

Я не уверен, почему он не может найти ссылки.Связано ли это с неиспользованием DLL-файлов (libQt5Core.dll и т. Д.).Я правильно связываюсь?

1 Ответ

0 голосов
/ 03 февраля 2019

Проблема была с моим файлом проекта QT (.pro).Я добавил следующую строку, и она скомпилирована и успешно запущена.

QT       += core gui widgets

Окончательный файл QT_simple.pro выглядит следующим образом:

QT       += core gui widgets

TEMPLATE = app
TARGET = QT_Simple
INCLUDEPATH += .

# Input
SOURCES += main.cpp

LIBS += -L"C:\Qt\Qt5.6.3\5.6.3\mingw49_32\lib" \
  -L"C:\Qt\Qt5.6.3\5.6.3\mingw49_32\lib" \
  -lmingw32 \
  -lqtmain \
  -lQt5Core \
  -lQt5Gui \

Спасибо за помощь!

...