【问题标题】:Run MFC program on Linux在 Linux 上运行 MFC 程序
【发布时间】:2011-10-20 05:17:30
【问题描述】:

我有一个相当大的基于 MFC 的程序。我的任务是让它在 Linux 上运行。我已经解释过,这将需要将程序重写为带有 STL 的直接 C++(更多工作)或 Qt/C++(更少工作)。现在有人告诉我,我需要编写包装器以使每个 MFC 类在 Linux 中工作,并使用预处理器指令仅编译 Linux 或 Windows 中所需的内容。我解释说我们的通信断开了,我认为这比从头开始重写整个项目(我不必这样做来转换为 Qt)要多。

有什么好的论据可以帮助解释这个问题吗?我错了吗?

【问题讨论】:

  • “需要编写包装器以使每个 MFC 类在 Linux 中工作”...嗯,什么?我会说 Qt 是最明智的选择。
  • MFC 只是 Windows API 的一个薄包装器。您必须将这些 API 调用中的每一个替换为等效的 Linux 调用。与你打交道的人显然对编程知之甚少!
  • 虚拟机(Linux作为hostm windows作为guest)是不可能的吗?
  • @Clifford :您还没有看到惯用的 MFC 代码。这非常假设CDC 只是HDC。当您在没有HDC 的系统上运行时,事情会迅速走下坡路。
  • 很好奇故事的结局。

标签: c++ qt stl mfc


【解决方案1】:

如果您不想完全重写,可以尝试针对Winelib 进行编译。大多数事情应该可以正常工作,然后由于您有源代码,您可以解决没有的部分。

【讨论】:

  • 在没有任何重新编译的情况下尝试在 Wine 下运行它是否有意义?
  • @Matt Rogers:如果你想逐步为 Linux 重写部分内容,Winelib 显然是更好的选择。
  • @Matt Rogers - 绝对值得一试。
  • ninjalj:同意,但是如果我们只是在谈论让它运行,那么第一步似乎是在 Wine 下尝试它。
  • Winlib 没有实现 MFC;您必须在 Linux 上针对 Winelib 编译 MFC 源代码,这在法律上是可疑的。有关详细信息,请参阅winehq.org/docs/winelib-guide/mfc。只需在 WINE 上运行而不重新编译,问题就会小得多。
【解决方案2】:

显而易见的解决方案是在 WINE 上运行未重新编译且未重新编译的代码。

一个简单(笨拙)的解决方案是在 Linux 系统上运行整个 Windows VM,并将应用程序部署为虚拟硬盘驱动器,但这需要 Windows 许可证,并且与简单地将 Windows 系统连接到Linux 网络。

如果必须重新编写,M​​FC 开发人员可能会比 Qt 更熟悉 wxWidgets。

Here is an article 关于将 MFC 应用程序移植到考虑使用 GTK+、Qt 和 wxWidgets 的 Linux。它还讨论了为什么您应该在任何这些选项之前考虑并尝试 WINE。作者谈到了关于该主题的未来文章,但自 2004 年以来似乎没有写过任何进一步的文章。

【讨论】:

  • +1,我也打算推荐 wxWidgets,只是 OP 似乎已经决定使用 Qt。
  • 我熟悉Qt,不太熟悉wxWidgets。这几乎是唯一的原因。
  • @E Freitas:熟悉就好,但是要移植代码,您还必须熟悉 MFC——只是为了理解它。 wxWidgets 与 MFC 非常相似,因此一些移植是直接替换类名的问题。详情见wiki.wxwidgets.org/WxWidgets_For_MFC_Programmers;它甚至提供了一个 sed 脚本来执行大量必要的替换,这可以让你在你的端口中抢占先机。另一方面,Qt 框架在架构上更加不同。
【解决方案3】:

MFC 和 ATL 的源代码总计超过 500000 行代码,这些代码的大部分功能实际上是由 Windows API 本身提供的。你一天能写多少行代码?即使您只实现 MFC 的一小部分,您被要求做的事情的规模也是不切实际的。

【讨论】:

  • 是的,我想象大约需要十年或更长时间的工作,而所有这些都没有任何 QA 部门。 :)
  • 任务没有你建议的那么大,因为任务不是你建议的。这当然不是重写 500000 行代码,而只是将类和函数调用从一个框架/操作系统映射到另一个框架/操作系统中的近似或精确等价物,并可能修改架构以匹配不同的框架和消息架构。几乎不切实际,只是努力工作。
  • @Clifford,我选择了 MFC 的源代码,因为它将 MFC 体系结构“映射”到 Windows API。由于另一个 API 不会直接匹配,我希望它会更难。另一个比较的基础是 wxWidgets 库,但目前我没有这些资源很容易获得。
  • @Clifford:wxWidgets 大约有 200 万个 LOC。 (ohloh.net/p/wxwidgets/analyses/latest) 因此,您看到的代码增加了四倍以实现非精确匹配;或许您应该再次将其加倍以替换 MFC。
  • @Mark:那么您是否建议在 Linux 上重新编译 MFC 源代码?微软的许可证是否允许这样做?无论哪种方式都已经针对 Winelib winehq.org/docs/winelib-guide/mfc 进行过。是的,将 MFC 接口映射到非 Win32 API 会很困难,但这并不是一个明智的方法。将可能很小的 subset MFC 接口映射到使用任何单个应用程序的 similar 类库/框架(例如 wxWidgets)是完全可行的,正如我在另一条评论中提到的,部分自动化。
猜你喜欢
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 2021-10-02
  • 2018-05-30
  • 1970-01-01
相关资源
最近更新 更多