我正在尝试/考虑使CppCMS - C++ Web 框架项目更加跨平台。
今天,我可以轻松地支持 Linux、OpenSolaris、FreeBSD 甚至 Cygwin。但是当涉及到 Native Windows 时,它变得非常痛苦:
情况概述:
- 我是 POSIX/Linux 开发人员,对 Visual Studio 和 Win32 API 等原生 Windows 开发工具几乎不熟悉。然而,我为这个平台做了一些工作,所以我理解 Windows 是完全不同的世界的局限性和事实。
这是使用在 Unix 世界中流行的 API 的 Web 项目,例如:在大多数 UNIX Web 服务器中实现的 CGI、FastCGI 和 SCGI;但我知道我无法将它与 IIS 一起使用,因为它不支持 TCP/IP 上的 FastCGI(仅限 Windows 管道)。
因此,即使它可以工作,它也可能只能在 Apache 的 Windows 端口上运行。
我非常依赖 POSIX API:
- Pref-forking 允许在崩溃的情况下保持高生存性(在 Windows 下不支持),因此此功能将丢失。
- 我使用了一些文件锁定工具(但我可能会在不分叉的情况下放弃它们)
- 我大量使用原生 pthread,甚至可以用 Boost.Thread 替换它们
- 我可能永远无法支持 Visual Studio(可能是支持 C++0x 的 2010 年),因为我使用的大多数编译器都支持 C++0x decltype/auto 功能或 typeof/__typeof__ 扩展:gcc,英特尔,太阳工作室。(说实话:没有它们我也可以工作,但它让框架用户的生活变得更加轻松。
- 我非常依赖自动工具,我不能用 CMake、bjam 或朋友来代替它们,因为在支持国际化、交叉编译、包管理时,它们只是没有给我一个解决方案。
- 有许多烦人的点,例如缺少 gmtime_r 或 windows 下的 localtime_r 以及许多其他只需要我重写它们或用第 3 部分库替换它们的点。
- 仍然有许多“类 UNIX”库可以移植到 Win32,例如:iconv、gcrypt 和其他一些像 libdbi 这样几乎没有移植的库,它们对 Windows 有很多限制。
底线:
有很多重要的工作要做,即使完成了,它也可能只能使用 MingW 工具而不是Windows 程序员熟悉的“本地”工具。
所以,我的问题是:
- 这样的 MingW 端口值得努力吗?这是否有助于建立更大的社区?
- 有没有人知道将大型项目从 POSIX 环境移植到 Win32 API 是多么痛苦?
- 它对 Windows 开发人员有用吗?
编辑:
对我来说,了解有多少 Windows 开发人员更喜欢使用开源开发工具(MingW)而不是像 VS 这样的微软开发解决方案对我来说也很重要。
编辑#2:关于“本机”Windows 解决方案和 IIS 的说明。
事实上,用 IIS 运行框架确实是个难题。我解释:
该项目涉及标准Web 服务器 API,如FastCGI或SCGI,允许通过单套接字接受许多请求。因此,在应用程序方面,我接受新请求并继续它并返回答案。有时几个线程处理多个请求。
因此,实现一个或两个标准协议,我打开与任何现有服务器的通信:Apache、lighttpd、nginx、切诺基......或任何其他服务器;IIS 除外
IIS 实现了 FastCGI,但是……它只支持每个本地进程只有 1 个连接,仅由 Web 服务器控制……
所以......绝对没有标准方法可以将我的应用程序连接到 IIS。
请注意,我实现了标准的 Web 服务器 API,我没有实现 IIS 专有的 ISAPI 和 Apache 的专有 API,甚至第二个对于针对 UNIX 世界更重要。
所以,只是 Windows IIS Web 世界还没有真正准备好与这样的项目合作,所以如果有人在 Windows 下使用它,它将与更开放的 Web 服务器一起使用。