GCC Windows - Bash Ubuntu Windows (WSL), CygWin, MinGW

GCC on Windows - Bash on Ubuntu on Windows (WSL), CygWin, MinGW

我目前正在使用 windows 8.1 并且正在寻找安装 GCC。我发现可以通过 MinGW 和 CygWin(最流行)来做到这一点。 现在我想到 Windows 子系统 Linux (WSL) 和 Bash 在 Windows 10 中的 Windows 上提供。

问题 1.是否可以通过 Windows10 中的 Bash 安装 GCC,是否可以像在Linux 分配。 假设你有一个 'helloworld.c' 文件,如果我有,

>     gcc helloworld.c
$     ./a

在 bash 中我会得到输出(假设 'helloworld.c' 的内容很简单 - 一个 cout 语句。)

问题 2. 如果可以的话,在 Windows 上使用 GCC 的方法中哪一种是首选。也就是说,a)MinGW 或 CygWin b)Bash on Linux on Windows。 因为根据我所读的内容,CygWin 和 MinGW 对在其上开发的程序有一定的依赖性。

问题 3. 如果您已经读到这里,请填补我对 CygWin 和 MinGW 的理解空白。也就是说,如果我只将它用于编译和 运行 宁代码而不是应用程序开发,那么我使用其中的哪一个都没有关系,对吗?因为代码(用 C 或 FORTRAN 编写)无论系统如何编译和执行都是一样的,对吗?

上下文。我是一名从事数值计算(计算流体动力学)的学生,我的主要工作是在 FORTRAN 中开发和 运行 CFD 代码。我想做的是在我的笔记本电脑上处理计算代码(我们主要使用 FORTRAN),运行s 在 Windows 上。我目前不打算为 Windows 或 Linux 开发应用程序或软件。但我仍然想知道事情是如何运作的,哪个是最好的选择。请详细说明。 谢谢。

回答你的第一个问题,是的,你可以在 WSL 下进行编译。

为了回答您的其他问题,让我们看看 MinGW。 MinGW 的维基百科条目是这样说的:

MinGW was forked from version 1.3.3 of Cygwin.[5] Although both Cygwin and MinGW can be used to port Unix software to Windows, they have different approaches:[16] Cygwin aims to provide a complete POSIX layer comprising a full implementation of all major Unix system calls and libraries. Compatibility is considered higher priority than performance. On the other hand, MinGW's priorities are simplicity and performance. As such, it does not provide certain POSIX APIs which cannot easily be implemented using the Windows API, such as fork(), mmap() and ioctl().[16] Applications written using a cross-platform library that has itself been ported to MinGW, such as SDL, wxWidgets, Qt, or GTK+, will usually compile as easily in MinGW as they would in Cygwin.

Windows programs written with Cygwin run on top of a copylefted compatibility DLL that must be distributed with the program, along with the program's source code. MinGW does not require a compatibility layer, since MinGW-based programs are compiled with direct calls to Windows APIs.

(https://en.wikipedia.org/wiki/MinGW)

这是 MinGW 网页 (http://www.mingw.org) 所说的:

MinGW, a contraction of "Minimalist GNU for Windows", is a minimalist development environment for native Microsoft Windows applications.

MinGW provides a complete Open Source programming tool set which is suitable for the development of native MS-Windows applications, and which do not depend on any 3rd-party C-Runtime DLLs. (It does depend on a number of DLLs provided by Microsoft themselves, as components of the operating system; most notable among these is MSVCRT.DLL, the Microsoft C runtime library. Additionally, threaded applications must ship with a freely distributable thread support DLL, provided as part of MinGW itself).

MinGW compilers provide access to the functionality of the Microsoft C runtime and some language-specific runtimes. MinGW, being Minimalist, does not, and never will, attempt to provide a POSIX runtime environment for POSIX application deployment on MS-Windows. If you want POSIX application deployment on this platform, please consider Cygwin instead.

相对于MinGW,我对WSL和Cygwin更熟悉。据我所知,MinGW 更倾向于生成合理可移植的 high-performance Windows 二进制文件,而 Cygwin 更针对 Unix 用户(或那些想要移植为 Unix/POSIX 编写的应用程序的用户)谁想要 Windows 下的 Unix-like 环境和所有装饰品。正如您所指出的,Cygwin 程序至少过去不太容易分发给没有安装 Cygwin 的其他人(出于许可证方面的考虑,但请参阅下面的 link)。 MinGW 程序 运行 作为本地 Windows 程序使用未记录的 Windows 本机库。 WSL 二进制文件本身不会 运行 在 Windows 下;它们仅 运行 在 WSL 环境中(或者可能是本机 Linux 系统)。 WSL 将 Linux 内核调用映射到 Windows 内核调用,而 Cygwin 实现了 Unix/Posix 库调用。 WSL 依赖于真正的 Linux 发行版来提供它的环境,而 Cygwin 依赖于它自己的环境。 (WSL 的优势在于它可以 运行 现有的二进制文件而无需重新编译。)我认为这些对您来说都不是太重要,因为您不打算分发您的二进制文件。你想要高性能。根据维基百科,MinGW 比 Cygwin 性能更高,但它也是 32 位的,这可能是您的应用程序的问题。有一个类似于 MinGW 的 64 位环境,但它是一个不同的项目。

一个重要的考虑因素是您要编写 Windows 代码还是 Unix/Linux/POSIX 代码。 MinGW 用于使用 Windows API 开发 Windows 应用程序(尽管您可以提供一些有限的 POSIX 支持); WSL 和 Cygwin 用于开发 Unix/Linux/POSIX 应用程序。这对于可移植性很重要。但是如果你正在开发我认为你正在开发的程序类型,几乎所有直接计算和很少花哨 I/O,它可能只是归结为个人喜好或方便。如果您能想出一个需要花费大量时间的小型代表性程序,并在每个环境下尝试 运行ning 它,您就可以找出性能最佳的程序。我认为这将取决于您自己的操作组合。

另见 What is the difference between Cygwin and MinGW?