我不是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环境中运行,它要求ME通过设置仿真层来幽默这些假设.
但是,GCC内部究竟依赖于那层?它只是在寻找stdlib头,它假设它会在"/ usr/lib"中找到那些头文件吗?
如果是这种情况,我不应该只是告诉它查看"C:/ gcc/lib"来查找这些头文件吗?
或者GCC本身是否依赖POSIX库来访问文件系统(并做其他低级别的东西)?如果是这样,那么我想知道为什么他们不只是静态地链接他们喜欢的Windows POSIX库.为什么要求用户设置依赖项,何时可以将这些依赖项直接构建到应用程序中?
其实,问题的前提是错误的:MinGW的 GCC不会不要求Cygwin的.
你会发现你根本不需要Cygwin.它在Windows上本机运行(至少32位).工具链和生成的二进制文件都独立于Cygwin.
Cygwin中提供的MinGW编译器是不同的:它们是在Cygwin平台上构建的,用于生成不依赖于Cygwin运行时的代码.在这种情况下,编译器本身依赖于Cygwin.但那是因为你是从Cygwin安装的.
GCC 的Cygwin版本要求安装Cygwin,用于编译的程序.
该MinGW的版本不需要编译后的任何其他比Windows的工作副本.
你不能真正将Cygwin环境和MinGW编译器混合在一起,因为Cygwin改变了预编译库的路径.
如果你需要一个bash风格的shell,但又不想使用Cygwin,我会推荐MSYS.
Cygwin与MinGW形成鲜明对比从MinGW Wiki复制而来
原则上Cygwin应用程序不被视为"Native Win32应用程序",因为它依赖于Cygwin®POSIXEmulation DLL或cygwin1.dll
Posix函数,并且不直接使用win32函数.另一方面,MinGW提供Win32 API提供的功能.在MinGW下移植应用程序时,函数不是Win32本机的fork()
,mmap()
或者ioctl()
需要重新实现到Win32等效项,以使应用程序正常运行.
POSIX(可移植操作系统接口)"是一个不断发展的,不断发展的文档,由IEEE生产并由ANSI和ISO标准化.POSIX的目标是应用程序的源代码可移植性"[1].
实际上,目标定义为编写一个源实现并使其在不同(POSIX兼容)系统上运行而只重新编译的能力.
GCC是一种能够实现这一承诺的编译器,因此,它需要一层代码才能使机器"达到"POSIX标准.
这是你问题答案的核心.
为了帮助我明白我的意思,我将为您提供以下练习:
编写一个没有特定于操作系统的#ifdefs的程序,该程序从用户的某个目录路径输入,并向stdout写入其内容列表(一个级别).
我想您会发现编写仅使用在任何UNIX或LINUX系统上编译的本机WIN32 API的代码非常困难
编写使用POSIX API的代码只会稍微困难一点 - 就像你可以在任何LINUX盒子上一样 - 并且在Windows下编译它(DevStudio2005现在有一个令人惊讶的POSIX兼容标题...你可能会得到关).
从上面拿LINUX程序,现在在Cygwin或MinGW下运行的GCC下编译它.我打赌它会编译并运行.
GCC是如何表现出那种神奇的?由Cygwin或MinGW提供的POSIX标头和实现.
GCC在Windows下对Cygwin/MinGW的依赖现在更有意义吗?
POSIX.4:真实世界的编程,Bill O'Gallmeister,O'Reilly&Associates,Inc.,第2页
我尝试让我在Windows下运行的程序像一个好的Windows公民,在Linux下就像一个好的Linux公民.