与其他编译器一起编译QT代码

时间:2018-07-17 12:36:54

标签: c++ qt makefile

我正在编译执行数字密集型计算的科学代码。我的过程如下:

以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。

1 个答案:

答案 0 :(得分:0)

根据以下讨论进行更新:

看一下QApplication构造函数参考,它似乎是用在main()中获得的命令行参数argc和argv初始化的。这样就可以将特定于Qt的标志传递到Qt基础结构。因此,不能像您的示例一样在没有参数的情况下创建它-您需要从main传递argc和argc。

对于编译包含信号和插槽的文件-这些功能不是标准的C ++,因此需要使用了解其含义的工具对其进行预处理。如果我理解正确,moc会将这些特定于Qt的功能转换为标准C ++代码,然后必须使用编译器进行编译。所以:

  1. 对特定于Qt的cpp文件使用命名约定,以便您可以创建makefile模式以使用moc处理它们。例如:文件 .moc.cpp
  2. 在您的makefile中的 file .cpp上创建一个依赖项,该依赖项取决于 file .moc.cpp
  3. 创建一个用于从.moc.cpp文件创建.cpp文件的规则,并在该规则中调用moc
  4. 在.cpp文件上调用普通的编译器。不要忘记您的包含目录等。
  5. 请确保您没有检入这些生成的文件,因为每次.moc.cpp文件更改时,它们都会更改。也许将它们转储到您的修订控制忽略的临时目录中?您可能需要四处搜索以查看其他示例项目是如何做到的。

侧面说明:声明app不带括号可能会导致“最令人头疼的解析”。 https://en.wikipedia.org/wiki/Most_vexing_parse

当声明一个对象但括号为空时,编译器最终将该行解释为该函数的函数原型,该函数不带参数并返回QApplication。