我不是 C++ 开发人员,但我一直对编译器很感兴趣,而且我对修补一些 GCC 的东西(尤其是 LLVM)很感兴趣。
在 Windows 上,GCC 需要 POSIX 仿真层(cygwin 或 MinGW)才能正确运行。
这是为什么?
我使用许多其他软件,用 C++ 编写并针对不同平台(Subversion、Firefox、Apache、MySQL)进行交叉编译,它们都不需要 cygwin 或 MinGW。
我对 C++ 最佳实践编程的理解是,您可以编写合理的平台中立代码并处理编译过程中的所有差异。
那么与 GCC 有什么关系呢?为什么它不能在 Windows 上本地运行?
编辑:
好的,到目前为止,这两个回复基本上说,“GCC 使用 posix 层,因为它使用 posix 标头”。
但这并不能真正回答问题。
假设我已经为我最喜欢的标准库准备了一组头文件。为什么我仍然需要 posix 标头?
GCC 是否需要 cygwin/mingw 才能实际运行?
还是只需要头文件和库的仿真层?如果是这样,为什么我不能只给它一个包含所需资源的“lib”目录?
再次编辑:
好的,我会再次尝试澄清问题...
我还用D 编程语言编写代码。官方编译器名为“dmd”,并且有适用于 Windows 和 linux 的官方编译器二进制文件。
Windows 版本不需要任何类型的 POSIX 仿真。Linux 版本不需要任何类型的 Win32 仿真。如果编译器对其环境有假设,它会很好地隐藏这些假设。
当然,我必须告诉编译器在哪里可以找到标准库以及在哪里可以找到静态或动态链接的库。
相比之下,GCC 坚持假装它在 posix 环境中运行,它要求我通过设置一个仿真层来满足这些假设。
但是,在 GCC 中,究竟是什么依赖于该层?它只是在寻找 stdlib 标头,并假设它会在“/usr/lib”中找到这些标头吗?
如果是这样的话,我不应该告诉它在“C:/gcc/lib”中查找那些头文件吗?
或者 GCC 本身是否依赖 POSIX 库来访问文件系统(以及做其他低级的事情)?如果是这样的话,那么我想知道为什么他们不只是静态链接到他们最喜欢的 windows POSIX 库。当用户可以将这些依赖项直接构建到应用程序中时,为什么还要要求用户设置依赖项?