为什么不是所有的 Mac 应用程序都能够轻松移植到 Linux?

为什么不是所有的 Mac 应用程序都能够轻松移植到 Linux?

既然 Apple OS-X 操作系统是 UNIX 的衍生品(BSD),并且底层(Intel)Mac 架构相同,那么为什么让 Apple 特定的应用程序在 Linux 上运行不是很简单呢?

答案1

OS X 实际上(主要是)是 BSD 上的专有图形外壳。要创建 OS X GUI 应用程序,必须遵循 Apple 公开的 API,因此它不是跨平台的,也不容易移植。
这就是为什么大多数库很容易移植(实际上大多数都是在 Linux 上开发的)到 Linux,但是不是它们的图形外壳。

附注:有一些框架可以用来创建跨平台 GUI 应用程序。Qt想到了这一点。但事实上,这些框架是跨平台的,这也使得使用它们创建的应用程序在特定平台上的用户友好度不如“原生”GUI 应用程序。这些框架往往使所有内容在各个平台上看起来都是通用的,这对于 Apple 来说很糟糕,因为 Apple 创造了一种非常具体的用户体验,不容易“适应”其他平台。

编辑(将评论纳入答案中 - 感谢@Nick、@kbisset 和@John):
一种解决方案是将整个 OS X 图形外壳(闭源 Cocoa/Core 库 - 这使得 OS X 真正独一无二)移植到 Linux。从技术上讲,Apple 可以很容易地做到这一点,但他们没有理由这样做,因为他们的整个商业模式就是他们整个平台的独特性 - 硬件和软件。
可以想象有人可能会尝试克隆这些库,但这将花费数十年的时间,而且由于必须复制所有未记录的调用,因此可能永远不会正确。

答案2

你说的 Apple 特定应用程序是指 GUI 应用程序吗?一旦你转到命令行,就会看到 Apple 特定 API 适用于所有东西(图形、声音等),而 Linux 不支持这些 API,因此你无法轻松移植应用程序。

答案3

图形层完全不同。OS X 使用专有图形框架,Linux 使用 X (X11/X.org)

几乎所有的原生 OS X 应用程序都使用了 Cocoa、CoreAnimation 等仅在 OS X 上可用的框架。

例如,假设您有一个应用程序存储用户的密码 - 在 OS X 上,这将使用其 Keychain 系统和相关 API。如果您要将其移植到 Linux,则没有直接的等效功能,因此您必须重新实现整个功能。这是一个很小的功能,需要大量重写。

如果您使用跨平台 GUI 库(如 GTK、Qt 或 wxWidgets)编写应用程序,那么移植将变得更加容易(或“可能”) - 但操作系统在 UI 方面仍然存在很大差异(例如,OS X 使用单独的菜单栏,而 Linux 倾向于为每个窗口提供菜单栏)

我见过的最好的跨平台移植之一是 传播,它将其主要功能实现为一个库(其中包含尽可能少的平台特定代码),然后分别为每个平台创建本机 GUI。这意味着每个端口共享大量代码,但都具有良好的本机界面(而不是单个界面,该界面非常适合 Linux,但在 OS X 上却不合适,反之亦然)

有一个项目叫科科特伦其“旨在实现一个跨平台的 Objective-C API,类似于 Apple Inc. 的 Cocoa 文档中描述的 API”,这可能会使移植变得更加容易,但最近似乎没有什么动静(最后一篇博客文章是在 2008 年 12 月)

答案4

因为大多数应用程序不仅依赖于它们所运行机器的处理器和底层架构,还依赖于用户界面工具包和其他特定于平台的库。

相关内容