【问题标题】:Porting windows application to linux将 windows 应用程序移植到 linux
【发布时间】:2017-05-12 23:25:18
【问题描述】:

我有一个需要移植到 Linux 上的应用程序。我正在考虑使用 Free Pascal,问题是应用程序使用 Windows API 来执行诸如串行端口通信等任务......是否有适用于 linux 用户的 msdn 或一本书,如果有 api,则介绍 linux 如何在内部工作。

我很困惑。

【问题讨论】:

  • 你没有说明,代码最初是用turbo pascal写的吗?

标签: linux porting freepascal


【解决方案1】:

好吧,很遗憾,但如果您的代码非常依赖于 Windows(不依赖于 VCL!),那么从一开始就编写应用程序可能会比移植它更快。

但如果只是串口问题,请尝试多平台 SynaSer 库,在这里找到它:http://synapse.ararat.cz

希望得到帮助:)

【讨论】:

  • 您可以使用可移植的工具包库(如 Gtk 或 Qt);这将有助于编写易于移植到 MacOSX 和 Windows 的 Linux 应用程序。
  • 好吧,纯 VCL 很好 - 您可以在多种系统中使用 Lazaru 的 LCL 应用程序,几乎不需要编码,只需将 Delphi 项目导入 Lazarus :) 还有 Code Ocean 项目是 Lazarus 加上很多移植的组件和库(包括 Turbo Power 等)。
  • 顺便说一下——网上有传言说 Delphi XE3(或 XE4)将有本地 Linux 编译器——至少 FireMonkey 会移植到它上面。然而,由于 Windowish depediences,VCL 的状态非常不明确。
  • OP 应该修改他的应用程序以在 windows 中使用突触,一旦他开始工作,他应该将项目转换为 Lazarus。
【解决方案2】:

Robert Love 有一本关于 Linux 系统编程的书 - 将涵盖该领域,而且 Love 的书通常都不错,因此值得一看。

您的问题并不完全清楚,但如果您担心 Windows 应用程序中对硬件控制功能的特定调用难以移植,我建议这是一种错误的恐惧。 Windows 和 Linux 的运行原则是应用程序级程序员应该远离硬件,所有这些都应该由操作系统内核处理,并且只能通过系统调用被应用程序访问。由于不同操作系统的内核面临来自用户/应用程序的相似需求,它们往往具有执行相同类型事情的系统调用。有必要将系统调用相互匹配,但我看不出为什么这是不可能的。

可能更麻烦的是您的 Windows 应用程序可能严重依赖 Windows 执行程序的窗口代码/API。再次为您的代码找到类似物并非不可能,但可能会更复杂一些,例如在 Linux 中,这些东西通常根本不在内核中处理(与 Windows 不同)。

但话又说回来,您的代码可能是针对 Qt 之类的可移植工具包/库编写的,这会使事情变得容易得多。

祝你好运。

【讨论】:

  • 我看不出 Qt 对串行编程有何帮助。 Lazarus/Freepascal 甚至可以自动将 QT 用于 VCL 应用程序。
  • 我没有说它对串行编程有帮助。我说它可能有助于窗口代码。这个应用程序大概会向用户展示一些结果。
  • 如果是 Delphi 应用程序,它使用 VCL。 Lazarus/FPC 等价物与 GTK2(或 -3,但它是 beta)或 QT 兼容并在 LInux 上呈现。无论如何,Delphi 和 Lazarus 是基于组件的系统,并且有用于各种事物的组件已经在 Windows/Linux 上抽象。最好尽可能多地使用它们。 (而且好处是你可以先在 Windows 上引入它们,确保它们能正常工作,然后才能移植)
【解决方案3】:

如果程序包含 GUI 代码,您必须使用 GTK/XLIB 等 Linux 库来创建窗口、表单、按钮等...

Windows 特定函数(如 EnterCriticalSection、WaitForSingleObject 或 _beginthreadex)必须替换为等效的 linux api 函数(可以在此处找到一个很好的教程: “www.ibm.com/developerworks/systems/library/es-MigratingWin32toLinux.html”)或者您可以使用诸如w2lplwine之类的库

【讨论】:

    【解决方案4】:

    我在 http://www.adontec.com/windows-to-linux-port-library.htm 发现的此类问题的有用库

    【讨论】:

      【解决方案5】:

      我在使用 WINE 时获得了很好的体验。 (https://www.winehq.org/) 您根本没有真正移植您的应用程序。您只需确保它不违反 WINE 的一些基本约束并按原样运行它。 WINE(虽然据说不是)是 Windows API 的模拟器,只会为您进行翻译。它对 API 的覆盖非常完整。

      【讨论】: