使用其他编译器编译QT代码
Compiling QT code with other compilers
我正在编译执行数值密集型计算的科学代码。我的流程如下:
针对CPU的代码由"英特尔C++编译器"编译
针对GPU的代码由NVCC
然后使用"英特尔C++编译程序"链接对象文件
为此,我编写了一个makefile来执行必要的步骤,所有操作都在命令行中执行。现在,我想在程序中添加一个GUI,使用Qt,但不使用QtCreator。作为测试,我正在尝试编译这里给出的"Hello World!桌面应用程序":https://wiki.qt.io/Getting_Started_on_the_Commandline
我的解释如下:
#include <QtGuiQtGui>
#include <QtWidgetsQApplication>
#include <QtWidgetsQLabel>
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代码?我将需要信号和插槽,因此可能需要moc,根据我可以在没有qmake或Qt Creator的情况下使用Qt吗?但我不会使用uic。
根据以下讨论进行更新:
查看QApplication构造函数引用,它似乎是用main()
中获得的命令行参数argc和argv初始化的。这使得可以将Qt特定的标志传递给Qt基础设施。因此,不能像您的示例中那样在没有参数的情况下创建它——您需要从main传递argc和argc。
至于编译包含信号和插槽的文件,这些功能不是标准的C++,因此需要通过知道其含义的工具对其进行预处理。如果我理解正确的话,moc
将这些Qt特定的特性转换为标准C++代码,然后必须使用编译器进行编译。因此:
- 对Qt特定的cpp文件使用命名约定,这样您就可以创建一个makefile模式来用
moc
处理它们。例如:文件.moc.cpp - 在makefile中创建对file.cpp的依赖项,该依赖项依赖于file.moc.cpp
- 创建一个从.moc.cpp文件创建.cpp文件的规则,并在该规则中调用
moc
- 对.cpp文件调用普通编译器。不要忘记您的包含目录等
- 请确保您没有签入这些生成的文件,因为每次.moc.cpp文件更改时,它们都会更改。也许可以将它们转储到被您的修订控制忽略的临时目录中?您可能想四处搜索,看看其他示例项目是如何做到这一点的
旁注:在不使用括号的情况下声明app
可能会导致出现the Most Vexing Parse的情况。https://en.wikipedia.org/wiki/Most_vexing_parse
当声明了一个对象,但括号为空时,编译器最终会将该行解释为一个不带参数并返回QApplication的函数的函数原型。
- 将 Qt 代码从 createTextureFromId 更新为 createTextureFromNativeObje
- 无法在这个基本的Qt代码片段中找到错误,但我被告知它肯定存在?
- 使用其他编译器编译QT代码
- 为什么我在有关文件编码格式的QT代码中获得了混乱的代码
- 寻求QT代码的解释
- 尝试从 Github 编译 OpenCV QT 代码时出错
- 如何将 Double 从 Qt c++ 代码传递到 QML 代码
- 尝试在代码块中编译 Qt/C++ 代码
- RTKlib(C库)与QT(C++代码)
- 如何在QML QTLocation图上添加C QT代码的POI
- 获取 QT 代码的普通C++实现
- 链接 Qwt 库时 Qt 代码中的分段错误
- QT代码的组织
- Python中的Qt C++代码,PyQt4
- 避免在使用ccache / clang编译Qt代码时出现多余的警告
- 如何将Qt代码分解为单独的部分
- 在Linux(Ubuntu 13.10和14.04)下运行Qt C++代码,而无需QtCoreApplication/Q
- Qt代码编辑器在右侧的区域中显示行号
- 如何优化涉及大量sql查询的Qt代码块
- 在Linux中编译windows Qt代码以及库中的更改