我想让我的C ++项目跨平台,我正在考虑使用Cygwin / MinGW。 但它们之间有什么区别?
另一个问题是我是否可以在没有Cygwin / MinGW的系统上运行二进制文件?
答案 0 :(得分:559)
简化,就像这样:
在Cygwin中编译一些东西,你正在编译 for Cygwin 。
在MinGW中编译一些内容并编译 for Windows 。
关于Cygwin
Cygwin的目的是通过模拟基于Unix的操作系统提供的许多小细节,并通过POSIX标准记录,使基于Unix的应用程序更容易移植到Windows。您的应用程序可以使用Unix功能,例如管道,Unix风格的文件和目录访问等等,它可以使用Cygwin进行编译,Cygwin将充当您应用程序周围的兼容层,因此很多那些特定于Unix的范例可以继续使用。
当您分发软件时,收件人需要将其与Cygwin运行时环境(由文件cygwin1.dll
提供)一起运行。您可以将此软件与软件一起分发,但您的软件必须遵守其开源许可证。甚至可能只是将软件与软件链接,但单独分发dll,可能仍需要您遵守开源许可证。
关于MinGW
MinGW旨在简单地成为GNU编译器工具的Windows端口,例如GCC,Make,Bash等。它不会尝试模拟或提供与Unix的全面兼容性,而是提供了在Windows 上使用GCC(GNU编译器)和少量其他工具的最低必要环境。它没有像Cygwin那样的Unix仿真层,但结果你的应用程序需要专门编程才能在Windows中运行,如果创建它依赖于在标准Unix环境中运行而且可能意味着重大改变使用特定于Unix的功能,例如前面提到的功能。默认情况下,在MinGW的GCC中编译的代码将编译为本机Windows X86目标,包括.exe和.dll文件,但您也可以使用正确的设置进行交叉编译,因为您基本上使用的是GNU编译器工具套件。
MinGW本质上是Microsoft Visual C++编译器及其相关链接/制作工具的替代品。在某些情况下,可能会使用MinGW编译用于使用Microsoft Visual C ++编译的内容,使用正确的库,在某些情况下还可以进行其他修改。
MinGW包含一些用于与Windows操作系统交互的基本标准库,但与GNU编译器集合中包含的常规标准库一样,这些都不会对您创建的软件施加许可限制。
对于非平凡的软件应用程序,除非您使用全面的跨平台框架,否则将它们设置为跨平台可能是一个相当大的挑战。在我写这篇文章的时候,Qt framework是最受欢迎的用户之一,允许构建适用于包括Windows在内的操作系统的图形应用程序,但也有其他选择。如果你从一开始就使用这样的框架,你不仅可以减少在移植到另一个平台时的麻烦,而且如果你正在写一个平台,你可以在所有平台上使用相同的图形小部件 - 窗口,菜单和控件。 GUI应用程序,让它们对用户来说是原生的。
答案 1 :(得分:304)
Cygwin尝试在Windows上创建完整的UNIX / POSIX环境。为此,它使用各种DLL。虽然这些DLL由GPLv3 +涵盖,但它们的许可证包含an exception,不会强制GPLv3 +涵盖派生的工作。 MinGW是一个C / C ++编译器套件,它允许您创建Windows可执行文件而不依赖于这些DLL - 您只需要正常的MSVC运行时,它们是任何正常Microsoft Windows安装的一部分。
您还可以获得一个类似于UNIX / POSIX的小环境,使用名为MSYS的MinGW编译。它没有任何接近Cygwin的所有功能,但对于想要使用MinGW的程序员来说是理想的。
答案 2 :(得分:137)
要添加其他答案,Cygwin附带MinGW库和标题,您可以通过使用-mno-cygwin标志与gcc链接到cygwin1.dll进行编译。我非常喜欢使用普通的MinGW和MSYS。
答案 3 :(得分:60)
维基百科进行了比较here。
来自Cygwin的website:
- Cygwin是一个类似Linux的Windows环境。它由两部分组成:一个DLL(cygwin1.dll),它充当Linux API仿真层,提供大量的Linux API功能。
- 提供Linux外观的工具集合。
来自Mingw的website:
MinGW(“Minimalistic GNU for Windows”)是一组免费提供且可自由分发的Windows特定头文件和导入库与GNU工具集相结合,允许用户生成不依赖于任何第三方C的本机Windows程序运行时DLL
答案 4 :(得分:45)
Cygwin使用DLL,cygwin.dll(或可能是一组DLL)在Windows上提供类似POSIX的运行时。
MinGW编译为本机Win32应用程序。
如果你用Cygwin构建一些东西,你安装它的任何系统也需要Cygwin DLL。 MinGW应用程序不需要任何特殊的运行时。
答案 5 :(得分:40)
阅读这些已回答的问题,以了解Cygwin和MinGW之间的区别。
问题1:我想创建一个我编写源代码一次的应用程序,编译一次并在任何平台(例如Windows,Linux和Mac OS X ......)中运行它。
回答#1:编写源代码 JAVA。编译源代码一次 在任何地方运行。
问题2:我想创建一个我编写源代码一次的应用程序但是没有问题我可以单独编译任何平台的源代码(例如Windows,Linux和Mac OS X ......)。
回答#2:用C编写源代码 或C ++。使用标准头文件 只要。为任何使用合适的编译器 平台(例如Visual Studio for Windows,GCC for Linux和XCode for 苹果电脑)。请注意,您不应该使用任何 高级编程功能 编译所有的源代码 平台成功。如果你使用 无C或C ++标准类或 函数,你的源代码没有 在其他平台上编译。
问题3:在回答问题#2时,很难为每个平台使用不同的编译器,是否有任何跨平台编译器?
答案#3:是的,使用GCC编译器。它 是一个跨平台的编译器。至 在Windows中编译源代码 使用提供GCC编译器的 MinGW 用于Windows并编译源代码 代码到本机Windows程序。不要 使用任何高级编程功能 (比如Windows API)来编译你的 所有平台的源代码 成功。如果您使用Windows API 函数,你的源代码没有 在其他平台上编译。
问题#4:C或C ++标准头文件不提供任何高级编程功能,如多线程。我该怎么办?
答案#4:您应该使用POSIX (便携式操作系统接口 [对于UNIX])标准。它提供了许多 高级编程功能和 工具。许多操作系统完全或 部分POSIX兼容(如Mac OS X,Solaris,BSD / OS和...)。一些 操作系统虽然不正式 认证为POSIX兼容,符合 在很大程度上(如Linux,FreeBSD, OpenSolaris和...)。 Cygwin 提供 符合POSIX标准的开发 和Microsoft的运行时环境 视窗。
因此:
答案 6 :(得分:25)
<强> Wikipedia Says 强>
MinGW
分散自Cygwin
的1.3.3版。虽然Cygwin
并且MinGW
可用于将UNIX
软件移植到Windows
,它们 有不同的方法:Cygwin
旨在提供完整的POSIX layer
它提供了几个系统调用和库的模拟 存在于Linux
,UNIX
和BSD
变体上。POSIX layer
在Windows
之上运行,牺牲性能在哪里 兼容性所必需的。因此,这种方法需要Windows
使用Cygwin
编写的程序,可以在copyleft之上运行 兼容性库,必须随程序一起分发 使用该程序的source code
。MinGW
旨在提供本地人 直接Windows API calls
的功能和性能。不像Cygwin
,MinGW
不需要兼容性层DLL
和 因此,程序不需要与source code
一起分发。由于
MinGW
取决于Windows API calls
,因此不能 提供完整的POSIX API
;它无法编译可以使用UNIX applications
编译的某些Cygwin
。具体来说,这个 适用于需要POSIX
功能的应用程序fork()
,mmap()
或ioctl()
以及期望在其中投放的广告POSIX environment
。使用cross-platform library
编写的应用程序本身已移植到MinGW
,例如SDL
,wxWidgets
,Qt
或GTK+
通常会轻松编译MinGW
就像他们在Cygwin
中一样。
MinGW
和MSYS
的组合提供了一个小的,独立的 可以无需离开即可加载到可移动介质上的环境 注册表中的条目或计算机上的文件。Cygwin
便携式 提供了类似的功能。通过提供更多功能,Cygwin
安装和维护变得更加复杂。
cross-compile Windows applications
也可以MinGW-GCC under POSIX systems
。这意味着开发人员不这样做 需要使用MSYS
进行Windows安装才能编译软件 在没有Windows
的情况下Cygwin
上运行。
答案 7 :(得分:23)
从移植C程序的角度来看,理解这一点的一个好方法是举一个例子:
#include <sys/stat.h>
#include <stdlib.h>
int main(void)
{
struct stat stbuf;
stat("c:foo.txt", &stbuf);
system("command");
printf("Hello, World\n");
return 0;
}
如果我们将stat
更改为_stat
,我们可以使用Microsoft Visual C编译此程序。我们也可以使用MinGW和Cygwin编译此程序。
在Microsoft Visual C下,程序将链接到MSVC可再发行的运行时库:mxvcrtnn.dll
,其中nn
是某个版本后缀。要运送此程序,我们必须包含该DLL。该DLL提供_stat
,system
和printf
。
在MinGW下,该程序将链接到msvcrt.dll
,这是一个内部的,未记录的,无版本的库,是Windows的一部分,并禁止应用程序使用。该库本质上是MS Visual C中可再发行的运行时库的一个分支,供Windows自己使用。
在这两个方面,该计划将有类似的行为:
stat
函数将返回非常有限的信息 - 例如,没有有用的权限或inode编号。c:file.txt
关联的当前工作目录解析路径c:
。 system
使用cmd.exe /c
运行外部命令。我们也可以在Cygwin下编译程序。与MS Visual C使用的可再发行的运行时类似,Cygwin程序将链接到Cygwin的运行时库:cygwin1.dll
(适当的Cygwin)和cyggcc_s-1.dll
(GCC运行时)支持)。由于Cygwin现在属于LGPL,我们可以打包我们的程序,即使它不是与GPL兼容的免费软件,也可以发送程序。
在Cygwin下,库函数的行为会有所不同:
stat
函数具有丰富的功能,在大多数字段中返回有意义的值。c:file.txt
根本不被理解为包含驱动器号引用,因为c:
后面没有斜杠。冒号被认为是名称的一部分,并以某种方式进入其中。在Cygwin中没有针对卷或驱动器的相对路径的概念,没有&#34;当前已记录的驱动器&#34;概念,没有每个驱动器当前的工作目录。system
函数尝试使用/bin/sh -c
解释器。 Cygwin将根据您的可执行文件的位置解析/
路径,并期望sh.exe
程序与您的可执行文件位于同一位置。 Cygwin和MinGW都允许您使用Win32功能。如果您想致电MessageBox
或CreateProcess
,您可以这样做。您还可以使用gcc -mwindows
在MinGW和Cygwin下轻松构建一个不需要控制台窗口的程序。
Cygwin不是严格的POSIX。除了提供对Windows API的访问之外,它还提供了自己的一些Microsoft C函数的实现(在msvcrt.dll
中找到的东西或可重新分发的msvcrtnn.dll
运行时)。一个例子是spawn*
函数系列,如spawnvp
。在Cygwin上使用而不是fork
和exec
是个好主意,因为它们更好地映射到没有fork
概念的Windows进程创建模型。
因此:
Cygwin的节目不会少于#34;本地&#34;以MS Visual C程序为基础,需要图书馆的伴奏。 Windows上的编程语言实现有望提供自己的运行时,甚至C语言实现。没有&#34; libc&#34;在Windows上供公众使用。
MinGW不需要第三方DLL的事实实际上是一个缺点;它取决于Visual C运行时的未记录的Windows内部分支。 MinGW这样做是因为GPL系统库例外适用于msvcrt.dll
,这意味着可以使用MinGW编译和重新分发GPL编辑的程序。
由于与msvcrt.dll
相比,它对POSIX提供了更广泛和更深入的支持,因此Cygwin是移植POSIX程序的优越环境。由于它现在属于LGPL,它允许重新分发具有各种许可证(开放源代码或封闭源代码)的应用程序。 Cygwin甚至包含VT100仿真和termios
,它们与Microsoft控制台一起使用!使用tcsetattr
设置原始模式并使用VT100代码控制光标的POSIX应用程序将在cmd.exe
窗口中正常工作。就最终用户而言,它是一个本机控制台应用程序,可以通过Win32调用来控制控制台。
然而:
/bin/sh
和其他问题。这些差异是Cygwin程序&#34;非本地&#34;的原因。如果程序将路径作为参数或从对话框输入,则Windows用户希望该路径的工作方式与在其他Windows程序中的工作方式相同。如果它没有那样工作,那就是一个问题。 插件: LGPL发布后不久,我启动了Cygnal(Cygwin Native Application Library)项目,提供了一个Cygwin DLL的分支,旨在解决这些问题。程序可以在Cygwin下开发,然后使用Cygnal版本的cygwin1.dll
进行部署而无需重新编译。随着这个库的改进,它将逐渐消除对MinGW的需求。
当Cygnal解决路径处理问题时,可以开发一个单独的可执行文件,当作为带有Cygnal的Windows应用程序提供时可以使用Windows路径,并且当安装在/usr/bin
下时可以与Cygwin路径无缝协作Cygwin的。在Cygwin下,可执行文件将透明地使用类似/cygdrive/c/Users/bob
的路径。在与cygwin1.dll
的Cygnal版本链接的本机部署中,该路径没有意义,而它会理解c:foo.txt
。
答案 8 :(得分:14)
不要忽视 AT&amp; T的U/Win 软件,该软件旨在帮助您在Windows上编译Unix应用程序(最新版本 - 2012-08-06;使用Eclipse Public License,版本1.0)。
像Cygwin一样,他们必须对抗图书馆;在他们的案例中POSIX.DLL
。 AT&amp; T的工作人员都是非常棒的工程师(同样的团队给你带来了ksh和dot),他们的东西值得一试。
答案 9 :(得分:10)
Cygwin模拟整个POSIX环境,而MinGW只是用于编译的最小工具集(编译本机Win应用程序。)因此,如果你想让你的项目跨平台,两者之间的选择是显而易见的,MinGW。
虽然您可能会考虑在Windows上使用VS,但在Linux / Unices上使用GCC。大多数开源项目都是这样做的(例如Firefox或Python)。
答案 10 :(得分:9)
要在商业/专有/非开源应用程序中使用Cygwin,您需要为&#34; license buyout&#34;而需要花费数万美元。来自红帽;这会以相当大的代价使standard licensing terms无效。 Google&#34; cygwin许可证费用&#34;并看到前几个结果。
对于mingw来说,不会产生这样的费用,许可证(PD,BSD,MIT)非常宽松。您最多可以 为您的应用程序提供许可证详细信息,例如使用mingw64-tdm时所需的winpthreads许可证。
编辑感谢Izzy Helianthus:商业许可证不再可用或不必要,因为在LGPL下的Cygwin is now being distributed的winsup子目录中找到了API库,而不是完整的GPL。
答案 11 :(得分:8)
请注意,实用程序行为可以在两者之间真正发生变化。
例如,Cygwin tar可以fork - 因为DLL中支持fork() - mingw版本不能。尝试从源代码编译mysql时,这是一个问题。
答案 12 :(得分:6)
Cygwin旨在为Windows提供或多或少的完整POSIX环境,包括一系列旨在提供完整的类Linux平台的工具。相比之下,MinGW和MSYS提供了一个轻量级,简约的POSIX类图层,只有gcc
和bash
等更基本的工具可用。由于MinGW更简约的方法,它没有提供Cygwin提供的POSIX API覆盖程度,因此无法构建某些可以在Cygwin上编译的程序。
就两者生成的代码而言,Cygwin工具链依赖于动态链接到大型运行时库cygwin1.dll
,而MinGW工具链将代码编译为动态链接到Windows本机C库的二进制文件{ {1}}以及msvcrt.dll
的部分内容。因此,Cygwin可执行文件更紧凑,但需要单独的可再发行DLL,而MinGW二进制文件可以单独发布,但往往更大。
基于Cygwin的程序需要运行单独的DLL这一事实也会导致许可限制。 Cygwin运行时库在GPLv3下获得许可,对于具有OSI兼容许可证的应用程序具有链接例外,因此希望围绕Cygwin构建闭源应用程序的开发人员必须从Red Hat获得商业许可。另一方面,MinGW代码可以在开源和闭源应用程序中使用,因为标题和库是允许的。
答案 13 :(得分:3)
Cygwin是一个类似Unix的环境和Microsoft Windows命令行界面。
Mingw是Microsoft Windows的GNU编译器集合(GCC)的本机软件端口,以及一组可自由分发的Windows API导入库和头文件。 MinGW允许开发人员创建本机Microsoft Windows应用程序。
如果存在所有必需的库(DLL),则可以在没有mingw
环境的情况下运行使用cygwin
生成的二进制文件。
答案 14 :(得分:2)
Cygwin
使用兼容性层,而MinGW
是原生的。这是主要区别之一。
答案 15 :(得分:2)
答案 16 :(得分:0)
MinGW (or MinGW-w64) Cygwin
-------------------- ------
Your program written Your program written
for Unix and Linux for Unix and Linux
| |
| |
V V
Heavy modifications Almost no modifications
| |
| |
V V
Compilation Compilation
Program compiled with Cygwin ---> Compatibility layer ---> Windows API
Program compiled with MinGW (or MingGW-w64) -------------> Windows API