如何让我的基于 makefile 的 C++ 项目以最短和最简单的方式使用 QT 库?

Posted

技术标签:

【中文标题】如何让我的基于 makefile 的 C++ 项目以最短和最简单的方式使用 QT 库?【英文标题】:How to get my makefile-based C++ project to work with QT library shortest and simplest way? 【发布时间】:2018-02-13 13:08:21 【问题描述】:

我有一个基于 Makefile 的 C++ 项目。 我使用 Eclipse 和 IDE(在 Ubuntu 上),它与 Makefile 完美配合。我自己手动编写Makefile,所以我不需要任何可以自动生成它的东西。

听说QT使用自己的qmake buld系统,从.pro项目文件生成Makefile:

除了 Qt Creator 之外,Qt 还提供了 qmake,这是一个跨平台的构建脚本生成工具,可以自动为跨平台的开发项目生成 Makefile。

Eclipse QT 插件描述说:

Qt Eclipse Integration 无缝集成了整个 Qt 开发工作流程: 纯基于 qmake 的项目管理(不强加 Eclipse 特定的项目文件格式),带有 .pro 文件导入器和图形项目编辑器

似乎如果我想使用 Qt,它绝对必须使用它自己的 qmake 构建系统,它将生成 makefile。我不喜欢这个想法,因为我的 Makefile 太复杂了,我不想花很多精力来弄清楚如何将我的整个 Makefile 转换为 .pro 文件或类似文件。

    有什么方法可以像使用任何其他库一样使用 Qt,将其安装到系统中,包括我的代码中的头文件并提供包含它的链接器路径?在不改变整个构建系统的情况下,即坚持使用手动编辑的 makefile 而不是使用 QtEditor,而是像以前一样使用 Eclipse?我不需要任何与 GUI 相关的 Qt 东西。 我一定要使用qmake吗?我可以像以前一样只使用make 命令吗?

【问题讨论】:

我相信您可以像使用其他 C++ 库和现有 Makefile 一样使用 Qt 库。但是,要使 Qt 的信号/插槽正常工作,您必须编写额外的规则来处理 moc 标头。有很多例子。例如这里:gist.github.com/mishurov/8134532 或 ***.com/a/17330017/2674506。 您可以在源目录中有一个Makefile,在project.pro 上运行qmake,然后在qmake 的输出目录中的Makefile 上运行make跨度> @Caleth doc.qt.io 说project files will use a straightforward declarative style, defining standard variables to indicate the source and header files that are used in the project。所以project.pro 将包含有关源代码文件的信息,但它已经在我现有的Makefile 中。我必须根据makefile自己编写.pro吗?那么保留原始 Makefile 有什么意义呢? 例如:您有my_gui_class.hppmy_gui_class.cppmy_gui_form.uiproject.pro 中,您将它们列在适当的部分中。当您运行qmake 时,它将生成一个Makefile,其中包含my_gui_class_moc.cpp : moc my_gui_class.hpp 之类的规则,它将生成信号和插槽所需的字符串表等,ui_my_gui_form.h : uic my_gui_form.ui 将生成一个基于QWidget 的表单类。 my_gui_class.cpp 指的是 ui_my_gui_form.h,即使该文件是构建工件(未在源代码控制中提交,将死于 make clean 等) 我更乐意看到 moc 标头/资源的附加规则,而不是 *.proqmake 附加到 makefile 构建。 【参考方案1】:

我相信您可以像使用其他 C++ 库和现有 Makefile 一样使用 Qt 库。您只需将任何 Qt 应用程序或库视为具有特定依赖关系的常规 C++ 应用程序或库。

然而,Qt 的信号/槽功能需要使用 Qt 的 moc 实用程序生成一些额外的代码。对于 Qt4 项目尤其如此,如果您使用基于“传统”宏的信号/插槽连接。所以你必须在你的 Makefile 中编写额外的规则来处理 moc 头文件。有很多关于如何做到这一点的例子。例如:this 或 this。

【讨论】:

以上是关于如何让我的基于 makefile 的 C++ 项目以最短和最简单的方式使用 QT 库?的主要内容,如果未能解决你的问题,请参考以下文章

c++ - 如何使用make链接c ++中不同目录中的对象而不在makefile中引用它们?

使用 Makefile.am/Makefile.in 在 Ubuntu Linux 中构建 c++ 项目

makefile C++ Linux 的问题

使用 C++ 入口点让 SDL 在 OSX 上工作

如何让我的 c++ 程序继续运行?

如何制作一个简单的 C++ Makefile