5

我正在尝试/考虑使CppCMS - C++ Web 框架项目更加跨平台。

今天,我可以轻松地支持 Linux、OpenSolaris、FreeBSD 甚至 Cygwin。但是当涉及到 Native Windows 时,它变得非常痛苦:

情况概述:

  1. 我是 POSIX/Linux 开发人员,对 Visual Studio 和 Win32 API 等原生 Windows 开发工具几乎不熟悉。然而,我为这个平台做了一些工作,所以我理解 Windows 是完全不同的世界的局限性和事实。
  2. 这是使用在 Unix 世界中流行的 API 的 Web 项目,例如:在大多数 UNIX Web 服务器中实现的 CGI、FastCGI 和 SCGI;但我知道我无法将它与 IIS 一起使用,因为它不支持 TCP/IP 上的 FastCGI(仅限 Windows 管道)。

    因此,即使它可以工作,它也可能只能在 Apache 的 Windows 端口上运行。

  3. 我非常依赖 POSIX API:

    • Pref-forking 允许在崩溃的情况下保持高生存性(在 Windows 下不支持),因此此功能将丢失。
    • 我使用了一些文件锁定工具(但我可能会在不分叉的情况下放弃它们)
    • 我大量使用原生 pthread,甚至可以用 Boost.Thread 替换它们
  4. 我可能永远无法支持 Visual Studio(可能是支持 C++0x 的 2010 年),因为我使用的大多数编译器都支持 C++0x decltype/auto 功能或 typeof/__typeof__ 扩展:gcc,英特尔,太阳工作室。(说实话:没有它们我也可以工作,但它让框架用户的生活变得更加轻松。
  5. 我非常依赖自动工具,我不能用 CMake、bjam 或朋友来代替它们,因为在支持国际化、交叉编译、包管理时,它们只是没有给我一个解决方案。
  6. 有许多烦人的点,例如缺少 gmtime_r 或 windows 下的 localtime_r 以及许多其他只需要我重写它们或用第 3 部分库替换它们的点。
  7. 仍然有许多“类 UNIX”库可以移植到 Win32,例如:iconv、gcrypt 和其他一些像 libdbi 这样几乎没有移植的库,它们对 Windows 有很多限制。

底线:

有很多重要的工作要做,即使完成了,它也可能只能使用 MingW 工具而不是Windows 程序员熟悉的“本地”工具。

所以,我的问题是:

  • 这样的 MingW 端口值得努力吗?这是否有助于建立更大的社区?
  • 有没有人知道将大型项目从 POSIX 环境移植到 Win32 API 是多么痛苦?
  • 它对 Windows 开发人员有用吗?

编辑:

对我来说,了解有多少 Windows 开发人员更喜欢使用开源开发工具(MingW)而不是像 VS 这样的微软开发解决方案对我来说也很重要。

编辑#2:关于“本机”Windows 解决方案和 IIS 的说明。

事实上,用 IIS 运行框架确实是个难题。我解释:

  • 该项目涉及标准Web 服务器 API,如FastCGISCGI,允许通过单套接字接受许多请求。因此,在应用程序方面,我接受新请求并继续它并返回答案。有时几个线程处理多个请求。

    因此,实现一个或两个标准协议,我打开与任何现有服务器的通信:Apache、lighttpd、nginx、切诺基......或任何其他服务器;IIS 除外

  • IIS 实现了 FastCGI,但是……它只支持每个本地进程只有 1 个连接,仅由 Web 服务器控制……

所以......绝对没有标准方法可以将我的应用程序连接到 IIS。

请注意,我实现了标准的 Web 服务器 API,我没有实现 IIS 专有的 ISAPI 和 Apache 的专有 API,甚至第二个对于针对 UNIX 世界更重要。

所以,只是 Windows IIS Web 世界还没有真正准备好与这样的项目合作,所以如果有人在 Windows 下使用它,它将与更开放的 Web 服务器一起使用。

4

5 回答 5

3

您应该根据用户需求做出决定。用户是否曾要求在 Windows 上使用该框架?如果是这样,他们是否解释了为什么要使用 Windows(例如,他们有哪些额外的限制,他们想要使用什么网络服务器等)?

通常,Windows 用户确实希望事情以 Windows 的方式工作。这意味着 Visual Studio 支持、IIS 支持、MSI 安装程序等等。如果某些东西仍然感觉像是 Unix,我宁愿使用 Unix 本身,而不是与一个半工作的端口作斗争。

于 2009-08-06T07:35:26.857 回答
2

作为一名 Windows 客户端应用程序开发人员,目前的开发环境部门基本上是 Win32 和其他所有东西,而且它们大多不兼容,这让我有点受伤。这就是为什么我准备为我的个人 Windows 应用程序项目迁移到 MinGW 并尝试使它们跨平台。

我建议逐渐转向更多的跨平台库,例如,正如您所建议的,将 pthreads 重构为 boost::thread,或者fork()使用 IPC 从多进程转向,可能还使用 boost 的工具。日期/时间的东西也可以用 Boost 库处理。至于数据库支持,有

我认为 Microsoft 编译器支持并不那么重要,因为 MinGW 提供了一个不错的构建环境以及所有支持它的 IDE,Eclipse CDT 和 Dev-C++ 是最受欢迎的。但是,如果您要使您的项目与 msvc 兼容,请确保用户将能够使用 Visual Studio 2010 的 Express 版本(一旦发布)——这样就没有人需要购买 Visual Studio 2010 (升级)只是为了使用你的项目,你需要最新的微软技术是没有问题的。

很可能你不会ifdef为你的项目规模的代码库避免一些 s,但如果不仅仅是为了获得宝贵的经验并通过一些新的快乐和感激的成员来扩展社区,那么这些努力肯定是值得的。

于 2009-08-10T09:49:56.873 回答
1

我认为您只需查看 SO 上提出的问题即可确定 Windows 上的 MinGW 用户(我就是其中之一)在开发社区中是少数——绝大多数 Windows 开发人员都在使用 MS 工具。无论如何,编译器只是问题的一半(或更少) - 如果您的架构依赖于分叉大量进程,那么使用 MinGW 对您没有帮助。我的建议是,如果你真的想做跨平台开发:

  • 看看 Apache 是怎么做的
  • 考虑使用 Apache 库作为您的基础
  • 不要使用非常新的或特定于编译器的语言特性
  • 使用多线程而不是多进程
于 2009-08-10T19:44:56.270 回答
1

你说你可以很容易地支持 Cygwin 让我想起了我看到过简单地捆绑在 cygwin1.dll 中以支持一些原始 Unix 代码的商业 Windows 软件。如果只需将 cygwin1.dll 添加到您的安装程序,请尝试一下。

于 2009-08-10T19:25:45.483 回答
1
  • 这样的 MingW 端口值得努力吗?这是否有助于建立更大的社区?

我仍在用我自己的大型 POSIX 项目解决这个问题,我的结论是,如果您以后需要与 Microsoft 产品交互,那么它是值得的,但是如果项目是中小型的,我只会使用 MingW,如果它是非常大,然后我会一直使用 MSDN Microsoft 开发工具 - 那里将提供大量帮助 - 但它会花费

  • 有没有人知道将大型项目从 POSIX 环境移植到 Win32 API 是多么痛苦?

到目前为止,我自己对我的 POSIX 项目的转换一直被搁置,因为处理每个问题所花费的时间是巨大的 - 尚未完成转换 - 如果我会

  • 它对 Windows 开发人员有用吗?

当然,使用 MSDN 中的工具在 Microsoft IDE 中工作肯定会减少开发时间,但它会增加您对 Microsoft 库的依赖——如果这是一个问题,您需要从一开始就决定这一点

** 实际上,您可以将必要的 cygwin dll 添加到您的项目中,然后您就可以在 Windows 中运行它

当我添加以下 dll 时,我设法让我的 POSIX 项目运行

cygboost_filesystem.dll
cygboost_system-mt-1_53.dll
cygboost_thread.dll
cyggcc_s-1.dll
cygstdc++-6.dll
cygwin1.dll

可能您的项目会有不同的依赖关系,但是如果您认为转换不值得,那么也许这对您来说是一个解决方案

您也可以将您的库添加为静态库,然后您最终只需提供最后一个 cygwin1.dll

于 2014-03-26T08:36:39.127 回答