我想让我的c++项目跨平台,我正在考虑使用Cygwin/MinGW。 但是它们之间有什么区别呢?
另一个问题是,我是否能够在没有Cygwin/MinGW的系统上运行二进制文件?
我想让我的c++项目跨平台,我正在考虑使用Cygwin/MinGW。 但是它们之间有什么区别呢?
另一个问题是,我是否能够在没有Cygwin/MinGW的系统上运行二进制文件?
当前回答
不要忽视AT&T的U/Win软件,该软件旨在帮助您在windows上编译Unix应用程序(最新版本- 2012-08-06;使用Eclipse公共许可证,版本1.0)。
像Cygwin一样,他们必须与图书馆赛跑;在它们的情况下是POSIX.DLL。AT&T的人都是很棒的工程师(同样的团队给你带来了ksh和dot),他们的东西值得一看。
其他回答
请注意,两者之间的效用行为确实不同。
例如,Cygwin tar可以fork -,因为DLL中支持fork(),而mingw版本则不支持。当试图从源代码编译mysql时,这是一个问题。
阅读这些已回答的问题,了解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 Mac)。注意,您不应该使用任何一种 高级编程特性 全部编译源代码 成功的平台。如果你使用 没有C或c++标准类或 函数,你的源代码没有 在其他平台编译。
问题#3:回答问题#2,在每个平台上使用不同的编译器是困难的,有跨平台的编译器吗?
答案#3:是的,使用GCC编译器。它 是一个跨平台编译器。来 在Windows中编译源代码 使用MinGW提供GCC编译器 并编译您的源代码 代码转换为本地Windows程序。不 使用任何高级编程特性 (如Windows API)来编译你的 所有平台的源代码 成功。如果你使用Windows API 函数,你的源代码没有 在其他平台编译。
问题4:C或c++标准头文件不提供任何高级编程特性,如多线程。我该怎么办?
Answer #4: You should use POSIX (Portable Operating System Interface [for UNIX]) standard. It provides many advanced programming features and tools. Many operating systems fully or partly POSIX compatible (like Mac OS X, Solaris, BSD/OS and ...). Some operating systems while not officially certified as POSIX compatible, conform in large part (like Linux, FreeBSD, OpenSolaris and ...). Cygwin provides a largely POSIX-compliant development and run-time environment for Microsoft Windows.
因此:
要在Windows下充分利用GCC跨平台编译器的优势,请使用MinGW。
要在Windows中使用POSIX标准高级编程特性和工具的优势,请使用Cygwin。
不要忽视AT&T的U/Win软件,该软件旨在帮助您在windows上编译Unix应用程序(最新版本- 2012-08-06;使用Eclipse公共许可证,版本1.0)。
像Cygwin一样,他们必须与图书馆赛跑;在它们的情况下是POSIX.DLL。AT&T的人都是很棒的工程师(同样的团队给你带来了ksh和dot),他们的东西值得一看。
简单来说,它是这样的:
在Cygwin中编译一些东西,你就是在为Cygwin编译它。 在MinGW中编译一些东西,你就是在为Windows编译它。
Cygwin是什么?
Cygwin是一个兼容层,通过模拟基于unix的操作系统提供的许多基本接口,如管道、unix风格的文件和目录访问等,可以很容易地将简单的基于unix的应用程序移植到Windows上,这是POSIX标准所记录的。Cygwin还与GNU编译器集合的一个端口和一些其他工具捆绑在Cygwin环境中。
如果您有使用POSIX接口的现有源代码,那么只需做很少甚至不做任何更改,就可以将其编译为与Cygwin一起使用,这大大简化了将简单的基于IO的Unix代码移植到Windows上的过程。
Cygwin的缺点
使用Cygwin进行编译涉及到将程序与Cygwin运行时环境链接,该环境通常作为动态链接库cygwin1.dll随程序一起分发。这个库是开放源码的,并且要求使用它的软件共享兼容的开放源码许可证,即使您单独发布dll,因为头文件和接口都包含在内。因此,这对如何授权代码施加了一些限制。
MinGW是什么?
MinGW是一个针对本地Windows的GNU编译器工具的发行版,包括GNU编译器集合、GNU Binutils和GNU调试器。还包括头文件和库,允许开发本机Windows应用程序。因此,这将作为微软Visual c++套件的开源替代品。
可以使用MinGW编译一些原本打算用Microsoft Visual c++编译的东西,只做了相对较小的修改。
默认情况下,在MinGW的GCC中编译的代码将编译到本机Windows目标,包括.exe和.dll文件,尽管您也可以通过正确的设置进行交叉编译,因为您基本上使用的是GNU编译器工具套件。
尽管MingW包含一些头文件和接口代码,允许您的代码与Windows API交互,但与常规标准库一样,这不会对您创建的软件施加许可限制。
MinGW的缺点
使用MinGW为Windows编译的软件必须使用Windows自己的API进行文件和IO访问。如果您正在将Unix/Linux应用程序移植到Windows,这可能意味着代码的重大更改,因为POSIX类型API不能再使用。
其他的考虑
For any non-trivial software application, such as one that uses a graphical interface, multimedia or accesses devices on the system, you leave the boundary of what Cygwin can do for you and further work will be needed to make your code cross-platform. But, this task can be simplified by using cross-platform toolkits or frameworks that allow coding once and having your code compile successfully for any platform. If you use such a framework from the start, you can not only reduce your headaches when it comes time to port to another platform but you can use the same graphical widgets - windows, menus and controls - across all platforms if you're writing a GUI app, and have them appear native to the user.
例如,开源Qt框架是一个流行的、全面的跨平台开发框架,允许构建跨操作系统(包括windows)的图形化应用程序。还有其他类似的框架。除了大型框架之外,还有数以千计的更专业的软件库,它们支持多个平台,使您不必担心为不同的平台编写不同的代码。
当您从一开始就开发跨平台软件时,通常没有任何理由使用Cygwin。当在Windows上编译时,你的目标通常是让你的代码可以用MingW或Microsoft Visual C/ c++编译,或者两者都可以。在Linux/*nix上编译时,通常直接使用GNU编译器和工具进行编译。
MinGW (or MinGW-w64) Cygwin
-------------------- ------
Your program written Your program written
for Unix and GNU/Linux for Unix and GNU/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