当我尝试用 makefile 编译我的 qt 程序时它不起作用
Posted
技术标签:
【中文标题】当我尝试用 makefile 编译我的 qt 程序时它不起作用【英文标题】:when i try to compile my qt programm with makefile it doesnt work 【发布时间】:2019-02-01 20:45:14 【问题描述】:当我在 qt 中编译我的程序时一切正常,但是当我使用手动编译它时:
qmake myFile.pro
制作
我收到以下错误:
pat@patate:~/Desktop/alerte_red_compile$ make
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -isystem /usr/include/i386-linux-gnu/qt5 -isystem /usr/include/i386-linux-gnu/qt5/QtWidgets -isystem /usr/include/i386-linux-gnu/qt5/QtGui -isystem /usr/include/i386-linux-gnu/qt5/QtNetwork -isystem /usr/include/i386-linux-gnu/qt5/QtCore -I. -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -o smtp.o smtp.cpp
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -isystem /usr/include/i386-linux-gnu/qt5 -isystem /usr/include/i386-linux-gnu/qt5/QtWidgets -isystem /usr/include/i386-linux-gnu/qt5/QtGui -isystem /usr/include/i386-linux-gnu/qt5/QtNetwork -isystem /usr/include/i386-linux-gnu/qt5/QtCore -I. -I/usr/lib/i386-linux-gnu/qt5/mkspecs/linux-g++ -o service.o service.cpp
service.cpp: In constructor ‘MainWindow::MainWindow()’:
service.cpp:9:5: error: ‘QMdiArea’ was not declared in this scope
QMdiArea *zoneCentrale = new QMdiArea; //multi fenetre
^~~~~~~~
service.cpp:9:15: error: ‘zoneCentrale’ was not declared in this scope
QMdiArea *zoneCentrale = new QMdiArea; //multi fenetre
^~~~~~~~~~~~
service.cpp:9:34: error: ‘QMdiArea’ does not name a type
QMdiArea *zoneCentrale = new QMdiArea; //multi fenetre
^~~~~~~~
service.cpp:16:5: error: ‘QGridLayout’ was not declared in this scope
QGridLayout *boutonsLayout = new QGridLayout;
^~~~~~~~~~~
service.cpp:16:18: error: ‘boutonsLayout’ was not declared in this scope
QGridLayout *boutonsLayout = new QGridLayout;
^~~~~~~~~~~~~
service.cpp:16:38: error: ‘QGridLayout’ does not name a type
QGridLayout *boutonsLayout = new QGridLayout;
^~~~~~~~~~~
service.cpp: In member function ‘void MainWindow::downloadFile()’:
service.cpp:140:24: error: ‘QFileDialog’ has not been declared
QString fileName = QFileDialog::getOpenFileName(this,
^~~~~~~~~~~
Makefile:352: recipe for target 'service.o' failed
make: *** [service.o] Error 1
是的,添加每个缺失的库都解决了这个问题!但我的问题是为什么在 qt creator 你不需要它?在这个阶段这并不重要,但如果有人有一个非常明确的答案,那就太好了。
我猜这些库是在 qt creator 中预编译的,需要在 qtcreator 之外添加。
【问题讨论】:
从错误来看,您似乎缺少Qt
的一些包含。 service.cpp 中有#include <QMdiArea>
吗?
您可能使用qmake
自动包含了一些您现在没有的标题。我将通过修改您的代码以添加缺少的包含来解决此问题。
好的编译,但我希望有人有更好的解决方案或解释......Qt正在跳过qmake步骤
我说修复丢失的包含是正确的解决方案。在我的Qt
开发中,我在每个源文件中都包含了我需要的所有头文件。虽然我使用CMake
来生成我的项目。
您可以尝试比较QtCreator生成的makefile和手动创建的makefile。还要检查 QtCreator 中的编译输出窗口以比较执行的语句(例如确切的 qmake 调用)。
【参考方案1】:
在这种情况下,您应该首先查看文档,这里是https://doc.qt.io/qt-5/qmdiarea.html 在顶部有一个框,上面写着“标题:”。
Header: #include <QMdiArea>
它会告诉您需要哪些包含才能使其工作。
另一行“qmake:”
qmake: QT += widgets
告诉您必须在 .pro 文件中添加的内容。需要这两个条目才能使其工作(除非它们已经以其他方式包含)。
第二个告诉构建系统,编译需要哪些文件,因此它会在 makefile 中生成带有正确标志的编译器调用。 第一个告诉编译过程中的预处理器需要哪些 qt 代码部分。
请记住,如果您更改了 .pro 文件,则必须再次运行 qmake 以重建 Makefile。
【讨论】:
以上是关于当我尝试用 makefile 编译我的 qt 程序时它不起作用的主要内容,如果未能解决你的问题,请参考以下文章