我正在编译执行数字密集型计算的科学代码。我的过程如下:
以CPU为目标的代码由Intel C ++编译器编译
针对GPU的代码由NVCC编译
然后使用英特尔C ++编译器
为此,我编写了一个makefile来执行必要的步骤,并且所有操作都在命令行上进行。现在,我希望使用Qt而不是Qt Creator在程序上添加GUI。作为测试,我正在尝试编译此处给出的“ Hello World!Desktop应用程序”:https://wiki.qt.io/Getting_Started_on_the_Commandline
我的解释如下:
#include <QtGui\QtGui>
#include <QtWidgets\QApplication>
#include <QtWidgets\QLabel>
void test_qt()
{
QApplication app();
QLabel label("Hello, world!");
label.show();
app.exec();
}
我在main.cpp文件中调用该函数。在我的makefile中,我链接到Qt5core.lib,Qt5Gui.lib和Qt5Widgets.lib,并且按照makefile规则,此文件是使用Intel C ++编译器编译的。但是,它给出以下错误:
error: expression must have class type
app.exec();
^
我的问题如下: 如何编辑我的makefile来编译Qt代码?我将需要信号和插槽,因此根据Can I use Qt without qmake or Qt Creator?可能需要moc,但我不会使用uic。
答案 0 :(得分:0)
根据以下讨论进行更新:
看一下QApplication构造函数参考,它似乎是用在main()
中获得的命令行参数argc和argv初始化的。这样就可以将特定于Qt的标志传递到Qt基础结构。因此,不能像您的示例一样在没有参数的情况下创建它-您需要从main传递argc和argc。
对于编译包含信号和插槽的文件-这些功能不是标准的C ++,因此需要使用了解其含义的工具对其进行预处理。如果我理解正确,moc
会将这些特定于Qt的功能转换为标准C ++代码,然后必须使用编译器进行编译。所以:
moc
处理它们。例如:文件 .moc.cpp moc
。侧面说明:声明app
不带括号可能会导致“最令人头疼的解析”。
https://en.wikipedia.org/wiki/Most_vexing_parse
当声明一个对象但括号为空时,编译器最终将该行解释为该函数的函数原型,该函数不带参数并返回QApplication。