为 Windows 平台构建的 Qt X11 应用程序

标签 qt mingw x11 cross-compiling mxe

我知道这很奇怪,但我需要在 MS Windows 平台上执行支持 X11 协议(protocol)的 Qt GUI 应用程序。

很明显,如果我在 Unix 环境中构建我的 Qt 源代码,它会自动成为一个 X11 应用程序,并且该应用程序只能在 Unix 操作系统上运行,而不能在 MS Windows 上运行。

我尝试使用 MXE(MinGW 交叉环境)在 Unix for Windows 中编译我的应用程序,但它对 X11 问题没有帮助。它为 Windows 创建一个应用程序,但该应用程序不是 XWindow 应用程序。

还有一个用于 minGW 的 XPortMinGW 项目。但我不知道它是否适用于 Qt 应用程序。

有什么方法可以构建可在 Windows 操作系统中运行的支持 X11 的 Qt 应用程序?

最佳答案

我认为没有交叉编译的必要。有两个问题:

  1. 为 Windows 编译 Xlib。我不知道任何移植到 Windows 的维护 Xlib 实现。您肯定需要找到一个或制作一个。希望 Xlib 仅依赖于少数 posix API,并且它们可能很容易转换为 win32。忘记 Cygwin。

    您可能会幸运地将 Xlib 自己移植到 Qt 的网络后端,并在此过程中使其跨平台。 Xlib 将简单地使用 Qt 的核心和网络模块。没问题。

    这里的好消息是 Qt 5 附带了一个捆绑的 Xlib 实现。在 Windows 上编译它可能比其他一些实现更容易。

  2. 配置 Qt 以在 Windows 上使用上述 Xlib 进行构建。为正确完成此操作,您可能需要稍微改动一下并重新构建 Qt 附带的配置工具,并添加一个将与 Xlib 链接的 makespec。

    使用 Qt 5 应该更容易做到这一点。

这不是一件完全微不足道的事情,但应该是可能的。给自己一个月的时间,期望能非常熟悉 Qt 的配置和 Xlib 的一些细节。

Cygwin注意事项

  1. 如果您的应用程序是闭源应用程序并在您的组织外部分发,您需要购买商业许可证才能重新分发 cygwin.dll。否则,Cygwin 是 GPL,只需链接到 cygwin.dll 即可使您的应用程序成为派生作品。

  2. 当您在同一个应用程序中混合使用 posix 和非 posix 代码时,Cygwin 会出现问题,尤其是当非 posix 代码是像 Qt 这样的大型框架时。您当然可以在 Qt 中使用 Posix 平台代码并使其全部在 Cygwin 上运行,但这样会降低性能并使您自己面临 Cygwin 的 POSIX API 仿真的缺点。

  3. 将 Cygwin 用于 Xlib/窗口系统,但让 Qt 以其他方式使用 Windows API 可能需要对 Qt 代码进行大量调整。因此,当然可以在 Windows 上将 Qt 与 Xlib 一起使用,但至少您不必调试/解决 Cygwin 的怪癖。

关于为 Windows 平台构建的 Qt X11 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11049202/

相关文章:

qt - Qt WebEngine:有没有一种方法可以模拟移动浏览器?

c++ - MinGW:C++ 编译器无法创建可执行文件

linux - 如何在 X-Windows 中改变焦点?

qt - 如何在QApplication执行之前获取QScreen

c++ - 使用图层类时 QT 未解析的外部符号

c++ - QSqlTableModel 中的附加空行

c++ - 混合 C 和 C++ 导致异常终止

qt - Ubuntu 的原生 gui 工具包,过去、现在和 future

c++ - 线程安全实现给出段错误

c++ - 为 32 位构建 zlib libz.a