根据qt.nokia.com,Qt是一个“跨平台应用程序和UI框架”,允许您“编写一次代码来定位多个平台”。 Qt SDK是一个“完整的开发环境”,包含“在一次安装中使用Qt构建跨平台应用程序所需的工具”。 Qt Creator是一个“跨平台IDE”,“可在Windows,Linux / X11和Mac OS X桌面操作系统上运行,并允许开发人员为多个桌面和移动设备平台创建应用程序。”
魔术词“交叉编译”没有明确提到那些网站的模糊。然而,一个天真的读者可能会原谅你推断你可以为你用于开发的任何主机系统下载Qt SDK(包括Qt Creator),创建一个项目,并编写一些你可以轻松的代码为Windows,Linux,Mac等生成可执行文件。通过“轻松”,我想到的是在构建设置对话框中勾选一些复选框,然后按“构建”按钮。
我还在寻找那些复选框!同时,我在这里和其他地方发现了各种关于安装交叉编译器,安装其他二进制文件,重写qmake文件等的帖子。从市场营销中,我有点期望交叉编译已经完全直接支持IDE和SDK工具的“开箱即用”安装。我错过了一些明显的东西吗?
如果没有,我可以使用所有三种操作系统的开发机器。我应该在所有三个平台上安装Qt Creator吗?如果我这样做,我可以期望能够使用Qt Creator开发的Qt项目(或者仅仅是源代码),例如Windows,将其复制到我的Mac或Linux机器上,然后构建它在那个平台上使用Qt Creator的版本,没有遇到一些重大问题?甚至可能是使用Qt为多个平台创建可执行文件的最佳实践,而不是在单个开发主机上安装交叉编译工具?
答案 0 :(得分:22)
Qt的标语是:
写一次,到处编译。
考虑到这一点,Qt没有正式提供任何开箱即用的解决方案,用于将Qt应用程序从特定平台交叉编译到其他不同平台。虽然绝对可行,但如果投入大量的工作和时间,Qt良好的通用做法会建议您直接在目标平台上构建您的Qt应用程序。这意味着,为您的应用程序构建一个Windows目标,一台Windows计算机,Mac计算机上的Mac目标和Linux目标,你猜对了(:-)),这是一台Linux机器。
这就是“一次编写,随处编译”,在我看来,这是一个非常精心选择的单词组合。否则,标记行可能是“一次编写,编译所有内容”。
回到最初的问题,您甚至不需要为每个目标平台使用不同的物理机,因为在这个时代的优秀虚拟化解决方案中,您可以轻松设置几个虚拟机并构建您的应用程序在同一台物理机器的不同平台上。
至于你的问题没有直接回答的其他问题:
我应该安装Qt Creator吗? 这三个平台?如果我这样做,可以 我希望能够接受Qt 项目(或者只是来源 我使用Qt开发的代码) Windows的创建者,复制它 到我的Mac或Linux机器,和 使用Qt版本在那里构建它 该平台的创建者,没有 遇到一些重大问题?
是。小问题就是在所有三个主要平台(Windows,Linux,Mac)或Mac Dock高级集成或托盘栏上正确获取应用程序可执行文件/二进制文件图标两者之间的集成问题。通过在特定于#define的编译器指令中正确封装特定于平台的代码,可以在不破坏代码的跨平台特性的情况下处理这些问题。我还建议对应用程序所需的每个其他平台特定代码执行此操作,或者如果您将广泛使用特定于平台的代码,将整个相关平台特定代码块分成几个特定于每个平台的动态加载库(或共享库),导出相同的抽象通用接口并根据需要加载/链接到它们。
可能甚至是最好的做法 使用Qt创建可执行文件 多个平台,与安装相比 单一的交叉编译工具 发展主持人?
您应该使用Qt SDK(Qt Creator或命令行工具)尽可能地构建应用程序,因为像qmake这样的工具将负担在Makefile中手动处理.moc文件的负担。但是,如果因为几个原因而变得不可能,例如。就像你的公司强加Visual Studio开发(跨平台吧?),有许多关于如何使用MS Visual Studio,GNU autotools或CMake等构建系统处理基于Qt的构建的教程。 虽然我建议坚持使用qmake,这是一个很好的“make makefile”生成器,并且很容易适应你的应用程序构建正确所需的任何平台特定的黑客,而不是使用对平台特定黑客更舒适的构建系统然后尝试满足Qt对这些构建系统的需求。毕竟,如果您出于跨平台原因在Qt中开发应用程序,那么Qt应该是您的应用程序的主要框架,而不是您可能使用的特定于平台的API /代码或第三方库。
我希望我已经足够清楚并乐于助人。
PS:我也欢迎就我在评论中所写的内容提出建议或修正/补充。
答案 1 :(得分:6)
您可以在Linux for Windows上使用MinGW
进行交叉编译。由于技术问题,无法交叉编译到Mac。从GUI执行此操作并不容易,但here是交叉编译QtWebKit for Windows的一个很好的方法。这可以应用于任何Qt项目。
答案 2 :(得分:3)
我认为没有交叉编译配置。
关于整个项目的可移植性,我会说“差不多”,因为我发现了一些烦人的故障。尽管如此,您的源代码将是100%可移植的,并且在另一个平台上重新编译只需要.pro中的一些技巧。
我所做的只是使用一个平台(Linux),并且不时地使用我的Windows机器和Mac Mini进行编译。我通常最终与之斗争的只是关于在哪里找到外部库或包含文件的一些指令。此外,在Mac上工作时,我要复制应用程序包中的外部文件,以便程序可以找到它们。
答案 3 :(得分:2)
上次我使用Qt时,就在几年前,你必须在你想要二进制文件的每个平台上编译。当然你可以交叉编译,但我认为你应该设置这样的东西。
也许其他人会提供更好的问题,但我认为你没有遗漏任何东西。
答案 4 :(得分:2)
我不了解Linux系统。但是,对于开发针对Mac OS X和Windows的Qt应用程序,您需要为每个应用程序开发一台开发机器。这两者没有交叉编译。
Qt是跨平台的,因为相同的源文件可以为不同的平台构建应用程序。有了所有可用的虚拟机,开发和构建多个目标的一个(物理)机器设置不应该是太多问题。事实上,这正是我正在开发的目标项目,它同时针对Mac和Windows。
答案 5 :(得分:1)
交叉编译通常用于在主机Linux系统上开发软件并编译目标Linux系统。多年来,我使用运行在带有X11(KDE)的x86上的Linux系统来交叉编译运行Qt Embedded的嵌入式ARM系统的Qt应用程序。如果您使用移动应用程序,则可能会进行交叉编译。当然,您可以在Windows系统上交叉编译。你真正需要的只是交叉编译器。由于gcc在源代码中可用,因此gcc交叉编译器非常常见。要使用Qt执行交叉编译,您需要一个用于qmake的mkspec,它指定要使用的编译器。
你的最后一段表明你可能无法进行这种交叉编译 - 你可以在你的Windows机器上为Linux或者可能在Mac上进行,你可以在Linux for Windows上进行如果您在Windows上使用mingw版本的Qt,但是您永远不会在Linux或Mac上为Windows编译基于Microsoft编译器的应用程序。
底线 - 按照你的指示行事。在每个目标平台上获取源代码并在那里进行编译。