何时使用Cygwin或MinGW编译C代码?

7
我想知道在什么情况下使用Cygwin来编译C代码,以及何时选择MinGW。我看到了描述Cygwin和MinGW之间区别的链接(What is the difference between Cygwin and MinGW?)。
据我所知,可以这样说:
- Cygwin:允许编译针对POSIX兼容操作系统的C源代码,以在Windows上运行(需要cygwin1.dll)。例如,我可以使用Windows的pthreads API编译应用程序,尽管Windows本身不实现该API。 - MinGW:允许编译符合Windows标准的C源代码。因此,使用上面的示例,在MinGW中使用gcc编译时无法使用pthreads API,而必须使用Windows提供的线程API。除了使用MinGW gcc编译器外,我还可以使用其他编译器,例如VC++自带的编译器。
然而,我的理解似乎是错误的,因为我能够使用MinGW编译包含pthread.h的虚拟程序。我哪里理解错了?
1个回答

4

您的理解基本上是正确的。但是,有一个win32 pthreads端口,它是对本地线程API的薄包装。

更合适的例子是fork(),在win32上无法轻松模拟。为此,Cygwin强制执行固定的DLL内存布局,如果库不能加载到其应该去的位置(提示rebaseall),则会出现问题。


那么我假设这个win32 pthreads端口已经包含在MinGW中了? - simon
@simon:以前不是这样的,但显然自2010-02-18起它是一个MinGW基础包(请参见http://sourceforge.net/projects/mingw/files/MinGW/Base/pthreads-w32/)。 - Christoph
@Christoph,Cygwin并没有强制规定固定的DLL内存布局,但它确实需要能够在分叉进程中以与父进程相同的地址加载DLL。 - ak2
@ak2:请查看http://code.google.com/p/chromium/wiki/CygwinDllRemappingFailure - Cygwin DLL的加载地址提示需要兼容,有效地强制执行固定的内存布局;当它发生变化时,您需要调用rebaseall... - Christoph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接