【问题标题】:C++ GUI without Frameworks没有框架的 C++ GUI
【发布时间】:2012-03-28 02:11:00
【问题描述】:

据我所知,没有办法让 C++ GUI 设计器将您的应用程序作为一个独立的可执行文件发布。所有 3rd 方框架都以 .dll-s 等形式添加它们的依赖项,无论是 MFC、Qt、WTL、wxWidgets、GTK。这让我只有一个解决方案 - 自己使用 Win32 API 为我当前的应用程序设计 GUI。我的假设是正确的还是我遗漏了什么?我一直想知道 uTorrent 和其他一些人是如何做到的。谢谢。

【问题讨论】:

  • 如果您的目标是明确地开发轻量级可执行文件 - 您最好坚持使用 Win32 API。恕我直言,这根本不是一个糟糕的选择。

标签: c++ user-interface frameworks


【解决方案1】:

不,您可以静态链接大多数流行的 GUI 框架,包括 MFC、Qt、ATL/WTL 和 wxWidgets。我不了解 GTK,但我认为您可能也可以静态链接它。

静态链接意味着您无需动态链接到 DLL 中的库代码,而是将该代码直接链接到可执行文件中,从而生成一个独立的 EXE 文件,您可以在没有任何外部依赖项的情况下发布。

当然,这些依赖项仍然存在,它们仍然会增大可执行文件的大小,这可能是个问题,具体取决于您的部署机制。此外,对于接近金属的编程也有话要说,因此直接使用 Win32 API 绝对是一种选择。这将产生绝对最小、最轻的应用程序,而且可能也是最快的。事实上,我相信这正是 μTorrent 所做的(或者至少,这是他们过去几个版本所做的)。

【讨论】:

  • 谢谢,我(或多或少)熟悉静态链接,不幸的是,这不是我的选择,因为我当前的项目要求应用程序尽可能轻巧且快速。我想我会坚持使用 Win32API。只是想确保没有更简单的选择。
  • @astralmaster 我不知道你的评论是什么意思。你想用一个框架,但是你觉得做不到,因为它太重了!静态链接不会使应用程序变慢。使用框架不会让应用变慢。大型可执行文件不会使应用程序变慢。您可以使用 GUI 框架,而无需大量的可执行文件。
  • 为什么对尺寸有这个要求?您是否需要在平均硬盘上存储 5 亿次可执行文件?想象一下,通过使用适当的框架,您可以在节省时间的同时实现哪些功能,并且只需要一点点更多的硬盘空间......
  • @David Heffernan 因为我正在开发的应用程序旨在运行在具有 256 KB 内存的设备上。 :)
  • 256 KB 的内存甚至无法运行 Windows,因此以 Windows API 为目标是毫无意义的。也许您的意思是 256 MB
【解决方案2】:

某些框架允许您构建一个自给自足的“独立单体”EXE,而无需任何额外的依赖项(除了操作系统提供的明显 API)。 例如,在 MFC 中,您可以选择“静态”或“动态”MFC 使用。第一个选项意味着所有需要的东西都将链接到您的 EXE 中。

【讨论】:

  • 感谢您的回复。我相信你同意 MFC 使用起来很痛苦。那么没有其他选择了吗?
【解决方案3】:

根据您的应用程序的最低操作系统要求,您可以动态链接到包含在 Windows 的最低目标版本中的 MFC 或 ATL(如果是 WTL 应用程序)版本。

这种解决方案还有一个额外的优势 - 每当使用的库的安全更新出现时,您无需更新应用程序即可从中受益。

但无论如何,为纯 Windows API 编写代码并没有那么可怕,所以我建议你使用它。

一个问题是使用较新版本的 Visual Studio 编译的应用程序需要最新的 CRT 运行时库,您必须在安装程序中提供该库或让用户自行安装。有办法克服这一点。我认为that blog entry 是我前段时间偶然发现的。当然,您必须小心,就好像您动态链接到旧的 CRT 库一样,最好也针对其标头进行编码。也许有办法完全摆脱 CRT 依赖。

编辑

在与 Cody Gray 进行激烈讨论后,我决定在下面进行详细说明,以重申我的观点并提出一些警告。

咆哮来袭

即使是桌面软件,您也必须在发布后为用户维护一项服务。操作系统版本会发生变化,它们的 API 和随附的库也会发生变化。 Apple 在使用较新的 OS X 和 iOS 版本“破坏”应用程序方面没有问题,开发人员明白他们必须让他们的产品保持最新,否则他们会失去客户或忙于支持电话。微软在“大商业世界”中创造了一类将软件视为建筑物的程序员。你设计它,建造它,有人批准它,你就完成了,也许再支持它两年。这不是应该的。

即使一个人编写了尽可能多的面向未来的应用程序,即取决于目标操作系统的完全定义、一般和记录的行为以及可能出现的任何行为,甚至它们静态链接到它使用的所有库,他们使其独立、正确和oldnewthing-approved,他们仍然必须在未来几年积极维护它。它所依赖的库确实发生了变化。它们被升级、改进、错误被移除、漏洞被修复、依赖于操作系统的行为被更新、被移除、被修复或被普遍化。

即使应用程序依赖于绝对最少的系统库集,上述所有内容也适用。

因此,无论您的应用是否应该在有限的时间内使用,您都必须假设并计划您将不得不维护它,如果有任何与您相关的变化应用程序。即使它是一个纯粹的 Win32 API 应用程序,您也必须检查它在较新版本的 Windows 中的行为方式,它是否提供了新操作系统的用户期望从他们的应用程序中获得的 UI 元素或服务。

话虽如此,如果您不走纯 Win32 API 路线,请注意使用任何我最初提到的 hack。

即使您的项目产生了一次性应用。即使只是为了让自己适应未来。

【讨论】:

  • 没有随 Windows 一起分发的 MFC 或 ATL 版本,因此这不是一个选项。该博客条目所产生的问题远远超过它解决的“问题”......
  • 我很肯定 Windows 附带了 MFC 和 ATL DLL。我认为 ATL 3.5 和 MFC 4.2。但是找不到任何可靠的来源。
  • 找不到可靠来源是有充分理由的;您的信息不正确。是的,Windows 附带了 internal 库供自己使用,但其中的关键词是 internal:这些库不适合应用程序使用。你不应该依赖他们在那里。您仍然必须随您的应用一起提供您的应用所需的库。 Windows is not an MFC delivery channel.
  • 我完全支持 Raymond Chen 的讲道,绝对不会依赖一些阴暗的 Kodak Image Viewer 组件,但我不会有依赖 MFC 4.2 或至少 ATL 3.5 的问题那里。我知道这可能部分造成了 Raymond 在他的博客中专门讨论的问题 - 迫使 MS 在 20 年前使 Windows 向后兼容。但是,嘿,我刚刚检查过——Windows 8 Consumer Preview 也附带了这些 DLL。如果你像我看到的那样关心你的应用程序,如果有任何变化,你肯定会更新它。但我的回答的要点仍然存在——选择 Pure。 ;)
  • 呃,最后一条评论是我读过的最大的矛盾。我什至不知道如何回应它...如果您认为链接的博客文章是关于 Kodak Image Viewer 的,那么您错过了重点(现在不要看,但他在底部专门向您讲话:“我现在预测大家都会评论最后两句话,完全忽略这篇文章的重点。”)。不,依赖 MFC 4.2 的存在是完全不正确的。出于某种原因,它是一个私有 DLL。它也与 Visual Studio 6 附带的 MFC 4.2 不同;与 CRT 相同的问题。
猜你喜欢
  • 2013-02-20
  • 2011-12-03
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
相关资源
最近更新 更多