是否可以使用 Cygwin 或 MinGW 将 Linux 守护程序移植到 Windows?

Posted

技术标签:

【中文标题】是否可以使用 Cygwin 或 MinGW 将 Linux 守护程序移植到 Windows?【英文标题】:Is it possible to port a Linux daemon to Windows using Cygwin or MinGW? 【发布时间】:2011-10-21 14:52:36 【问题描述】:

我有一个作为守护进程运行的 Linux C++ 应用程序。当用户执行此应用程序时,它将在后台运行,侦听端口,并等待来自客户端的连接。

是否可以使用 Cygwin 或 MinGW 将此类应用程序移植到 Windows 平台?

谢谢。

【问题讨论】:

【参考方案1】:

Cygwin 的目标是 POSIX/Linux 源代码级别的兼容性,因此您的应用程序应该可以在那里构建和工作,而无需或只需进行少量修改。

MinGW 不尝试提供这样的兼容层。它只是适用于 Windows 的 GNU 工具链,因此您需要将任何使用 POSIX/Linux 特定的 API 替换为 Windows 等价物。

【讨论】:

+1 特别是,Cygwin 以(功能上)完全相同的方式实现fork,这是守护进程所需的内容之一。虽然不可否认,我个人更喜欢编写本机实现(即服务),即使它需要更多工作。【参考方案2】:

几乎可以移植任何东西(除非它只对一个操作系统有意义)。问题是,“移植应用程序 X 有多难”?为了帮助回答这个问题,我们需要查看源代码。

通用提示

它基本上归结为您在代码库中分布了多少编译器/系统相关代码。我看到您至少使用了两种敏感的东西:守护进程和套接字。

守护进程很难移植,因为 Windows 上的等效进程(windows service)需要不同的平台特定代码。这是固定成本(例如,不会因应用程序其余部分的大小而异)。

根据您是否使用高级网络功能(异步 I/O 等),套接字或多或少难以移植,这些功能往往因系统而异。它还取决于您是否将套接字操作代码抽象为一些可重用的组件。 Windows 支持一个非常相似的套接字接口(经典的 BSD 套接字接口,对 API 的随机部分进行了少量修改)。如果您不编写包装类,则更改一个 Socket 类比更改代码更容易。

【讨论】:

以上是关于是否可以使用 Cygwin 或 MinGW 将 Linux 守护程序移植到 Windows?的主要内容,如果未能解决你的问题,请参考以下文章

在 Cygwin 或 MinGW 中使用 CMake 和 AVR 工具链

Cygwin和MinGW有什么区别?

Eclipse CDT 找不到 Cygwin 或 MinGW 工具链

如何将使用sysioctl.h的代码移植到MinGW gcc中?

我的cygwin怎么用不了?

mingw和cygwin区别