我想让我的 C++ 项目跨平台,我正在考虑使用 Cygwin/MinGW。但是它们之间有什么区别?
另一个问题是我是否能够在没有 Cygwin/MinGW 的系统上运行二进制文件?
作为简化,它是这样的:
在 Cygwin 中编译一些东西,你正在 为 Cygwin 编译它。
在 MinGW 中编译一些东西,你正在 为 Windows 编译它。
关于 Cygwin
Cygwin 是一个兼容层,通过模拟基于 Unix 的操作系统提供的许多基本接口,例如管道、Unix 样式的文件和目录访问等,可以轻松地将简单的基于 Unix 的应用程序移植到 Windows。由POSIX标准记录。如果您有使用这些接口的现有源代码,您可以在进行很少甚至没有更改后编译它以与 Cygwin 一起使用,从而大大简化了移植简单的基于 IO 的 Unix 代码以在 Windows 上使用的过程。
当您分发您的软件时,接收者需要将它与 Cygwin 运行时环境(由文件提供cygwin1.dll)一起运行。您可以将其与您的软件一起分发,但您的软件必须遵守其开源许可证。即使只是将您的软件与其链接,但单独分发 dll,仍然可以对您的代码施加许可证限制。
cygwin1.dll
关于明威
MinGW 旨在简单地成为 GNU 的 Windows 开发工具的一个端口。它不尝试模拟或提供与 Unix 的全面兼容性,而是提供可在 Windows 中本地使用的 GNU Compiler Collection、GNU Binutils 和 GNU Debugger 版本。它还包括允许在代码中使用 Windows 原生 API 的头文件。
因此,您的应用程序需要使用 Windows API 专门针对 Windows 进行编程,如果创建它以依赖于在标准 Unix 环境中运行并使用 Unix 特定功能,这可能意味着重大改变。默认情况下,在 MinGW 的 GCC 中编译的代码将编译为本机 Windows X86 目标,包括 .exe 和 .dll 文件,尽管您也可以使用正确的设置进行交叉编译,因为您基本上使用的是 GNU 编译器工具套件。
MinGW 是在 Windows 上使用Microsoft Visual C++编译器及其相关链接/制作工具的免费开源替代方案。在某些情况下,可以使用 MinGW 编译旨在使用 Microsoft Visual C++ 编译的内容,而无需进行太多修改。
尽管 MingW 包含一些头文件和接口代码,允许您的代码与 Windows API 交互,但与常规标准库一样,这不会对您创建的软件施加许可限制。
其他注意事项
对于任何重要的软件应用程序,例如使用图形界面、多媒体或访问系统上的设备的应用程序,您离开了 Cygwin 可以为您做的事情的界限,需要进一步的工作来使您的代码跨平台。但是,可以通过使用跨平台工具包或框架来简化此任务,这些工具包或框架允许编码一次并为任何平台成功编译您的代码。如果您从一开始就使用这样的框架,您不仅可以减少移植到另一个平台时的麻烦,而且您可以在所有平台上使用相同的图形小部件——窗口、菜单和控件——如果你正在编写一个GUI 应用程序,并让它们对用户来说是原生的。
例如,开源Qt 框架是一个流行且全面的跨平台开发框架,允许构建跨操作系统(包括 Windows)工作的图形应用程序。还有其他这样的框架。除了大型框架之外,还有数千个更专业的软件库支持多个平台,让您不必担心为不同平台编写不同的代码。
当您从一开始就开发跨平台软件时,通常没有任何理由使用 Cygwin。在 Windows 上编译时,您通常的目标是使您的代码能够使用 MingW 或 Microsoft Visual C/C++ 进行编译,或两者兼而有之。在 Linux/*nix 上编译时,您通常会直接使用 GNU 编译器和工具对其进行编译。