将大型C项目从Unix移植到Windows

时间:2010-09-22 20:28:11

标签: c windows unix port

所以,我有一个完全在Unix上构建的大型C项目(SPARC Solaris)。我和其他几个人已经开始重新审视它了,因为他们对windows build感兴趣。

我们都没有用这么大的项目做过这个,所以对于初学者来说,有没有人从unix移植到windows中,可能会给我一些指示或者他们是如何做到的。

我们计划的第一步是决定编译器/开发环境。

似乎我们的选项是MS Visual Studio,Cygwin,mingw / gcc和Windows Services for UNIX(SFU)。

我们的时间表相当短,所以我们希望尽可能少地重写代码。

所以,决定编译器。

另一个问题是代码确实使用POSIX线程命令(pthread等)

我们更愿意本地编译,而不是在可执行文件和操作系统之间使用某种层。不幸的是,我们的代码中有pthread调用,这可能是不可能的。

我相信Cygwin和SFU都是这样做的。 Cygwin有一个必须包含在编译代码中的.dll才能工作。我不确定SFU,任何有关这方面的信息将不胜感激。看起来它似乎是一个不错的选择,但开发的目的是允许UNIX编译的软件在带有SFU的Windows机器上运行,而不是任何旧的Windows框。

mingw确实能够创建本地exes,但缺乏POSIX支持。

因此,在这种情况下,任何人都可以向我提供有关这些编译器的更多信息,建议和知识。或者他们对此类事物的任何经验,非常感谢。

3 个答案:

答案 0 :(得分:7)

时间表短吗? CygWin,朴实而简单。

尽管偏好不使用图层,但这将提供最快的路径,而您似乎并未表明时间范围要求是灵活的。

我们使用CygWin将命令行和基于X的UNIX程序移植到Windows,而且麻烦最小。

答案 1 :(得分:3)

Cygwin可能是工作可执行文件的最快路径。但是它会给你一些有趣的发行选择。最明显的是,cygwin.dll成为依赖。其许可的GPL,除非您付钱购买商业使用权。

Cygwin对普通的Windows用户并不是特别友好。它的目标是在Windows上提供完整的POSIX体验,提供shell,所有熟悉的* nix实用程序,甚至是X的端口。但是,它还将Windows磁盘驱动器重命名为类似POSIX的文件系统。我从未尝试将为Cygwin构建的应用程序分发给尚未安装完整Cygwin的机器。我会注意到据我所知,Windows端口的大型知名开源应用程序都不是基于Cygwin。

如果你唯一的硬POSIX依赖是pthreads,那么这是可以解决的。在本机Windows线程上构建了一个pthreads端口,与MinGW配合良好。 IIRC,它甚至与MinGW一起分发,或者至少是他们核心支持的软件包之一。

如果您对文件名的其余处理大部分都是不透明的字符串,您甚至可能不需要关心将/更改为\。 Windows API通常乐意将这两个字符视为路径分隔符,甚至是同名的混合字符。使用/命令行选项的CMD.EXE和早期DOS约定阻止在命令提示符处使用/作为路径名,而不是基础Windows API。

对于可能使构建过程更容易移植的工具,请查看MinGW的MSYS组件。它提供了一个来自Cygwin环境的轻量级分支,其中有足够的* nix实用程序可用于通常运行./configure和类似的进程。

此外,GnuWin32项目具有大量实用程序和库的端口,这些实用程序和库都构建为作为本机Windows应用程序运行而没有异常依赖。

答案 2 :(得分:2)

如果代码(至少大部分)是可移植的,并且唯一的主要问题是使用pthread,则可能需要使用Pthreads Win32库。虽然不完整,但它足够完整和准确,可以处理我尝试过的大多数pthreads代码。虽然通常构建为DLL,但它也可以构建为静态库,以避免在可执行文件中创建额外的依赖项。

当然,这会将其他所有内容留给端口 - 但是你还没有说甚至猜测在你的时间范围内移植其余部分是否合理。