【问题标题】:Compiling QT code with other compilers使用其他编译器编译 QT 代码
【发布时间】:2018-07-17 12:36:53
【问题描述】:

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

针对 CPU 的代码由英特尔 C++ 编译器编译
针对 GPU 的代码由 NVCC 编译
然后使用英特尔 C++ 编译器链接目标文件

为此,我编写了一个 makefile 来执行必要的步骤,并且一切都在命令行上进行。现在,我希望在程序中添加一个 GUI,使用 Qt,但不使用 Qt Creator。作为测试,我正在尝试编译此处给出的“Hello World!桌面应用程序”: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 规则,这是使用英特尔 C++ 编译器编译的。但是,它给出了以下错误:

error: expression must have class type  
app.exec();  
^

我的问题如下: 如何编辑我的 makefile 来编译 Qt 代码?我将需要信号和插槽,因此根据Can I use Qt without qmake or Qt Creator? 可能需要 moc,但我不会使用 uic。

【问题讨论】:

  • QApplication app(); - 这是一个函数声明。
  • 您可能想要启用一些编译器警告

标签: c++ qt makefile


【解决方案1】:

根据以下讨论进行更新:

查看 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。

【讨论】:

  • 然后我得到以下错误:类“QApplication”没有默认构造函数
  • @HamzaAB 检查documentation 中的QApplication ctor。
  • @BareMetalCoder 这样做在我执行app.exec() 时仍然给我同样的错误,这似乎是问题区域。我现在将检查添加 argc 和 argv。
  • 看来我这里太生疏了——你看过stackoverflow.com/questions/11395562/… 吗?我已经相应地更新了我的回复
  • @BareMetalCoder argc & argv 完成这项工作!如果我想使用信号和槽,我是否对包含它们的文件调用 moc,然后使用任何 c++ 编译器链接生成的目标文件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
相关资源
最近更新 更多