25

我不想知道windows和linux中的API函数是否存在一对一的等价关系,也不想知道每一个API函数。

我只想知道这两个基本的事情:

  1. 我想了解为什么 Qt 平台独立
  2. 我想知道我应该在 linux 中使用什么 API 来移植使用 Win32 API 编程的应用程序,或者换句话说,在 Win32 API 级别。

我知道这不切实际,但我想知道这种等效性。

4

2 回答 2

24

您需要了解系统调用是什么。在 Linux 上,它们是最低可能的用户空间API(相比之下,Win32 API可能将真正的内核系统调用与一些库函数libc混合在一起。在 Linux 上也是如此)。fork(2) , execve(2) , open(2) , pipe(2) , mmap(2) , read(2) , poll(2) , close(2) , dup2(2) , sigaction(2)是重要的系统调用(但大约有 300 个,请参阅syscalls(2)获取列表,这取决于您的精确 Linux内核)。

不要期望每个 Windows 功能都可以在 Linux 上使用(反之亦然)。

甚至不要想到这样的等价物。

在 Linux 上获得不同的心态。

(特别是, Linux 和 Windows 上的进程非常不同)。

不要忘记 Linux 是免费软件,您可以深入了解您在 Linux 上使用的每个功能的源代码。阅读它,搜索它,改进它......

首先阅读intro(2)手册页,以及其他几个手册页(特别是syscalls(2)intro(3)等...)。另请阅读高级 Linux 编程高级 Unix 编程等。

一些库试图分解并为 Posix(例如 Linux)和 Windows 提供一个通用的抽象。特别是Qt(还有 Gtk 或FLTKPOCO,以及用于 Web 应用程序的Wt和用于数据库的sqlite )。

一些开源服务器软件(如lighttpdeximpostgresql等)可以在 Linux 和 Windows 上运行(当然是重新编译后)

如果您对图形界面感兴趣,请了解 X11 的重要作用注意 X11 服务器最靠近屏幕和键盘;大多数图形应用程序是 X11 客户端)。在 2016 年或 2020 年,X11 往往会被Wayland取代(但如果您针对 Qt 或GTK进行编码,您将不会注意到实现“细节” - 一个非常重要的细节)

如果您编写的应用程序仅使用 Qt 和/或 POCO 调用(未记录为特定于 Linux 或 Windows 的调用)以及标准 C++ 函数,则它应该可以从 Linux 源移植到 Windows,反之亦然。

于 2013-01-04T18:04:36.987 回答
6

如果你想移植一个使用 Win32 调用的应用程序,你最好的选择可能是使用WineLib。这使用了支持 Wine 的库,但它与仅使用 Wine 运行应用程序不同——您将应用程序重新编译为 Linux 应用程序,只需使用 WineLib 共享库。但它仍然看起来像一个 Windows 应用程序,除非您随后修改 UI 层。

正如答案中其他地方所说,Linux中没有真正直接等同于Win32的东西——不同的Win32位由不同的组件提供,有时你可以选择组件。这是可能的,因为 Win32 的某些等效部分是在较低级别本地实现的——例如,Win32 提供 UI 组件,其等效项在 GTK、Qt 或任何数量的其他工具包(如 WineLib)中都可用,它们本身与 X 交互。就像您通常使用 Win32 中的组件而不是使用较低级别的 API 调用绘制自己的组件一样,您通常会使用高级 UI 工具包中的组件而不是直接使用 X。

于 2013-01-04T18:21:41.410 回答