当前位置:  开发笔记 > 开发工具 > 正文

为什么GCC-Windows依赖于cygwin?

如何解决《为什么GCC-Windows依赖于cygwin?》经验,为你挑选了4个好方法。

我不是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库.为什么要求用户设置依赖项,何时可以将这些依赖项直接构建到应用程序中?



1> David Courna..:

其实,问题的前提是错误的:MinGW的 GCC不会要求Cygwin的.

你会发现你根本不需要Cygwin.它在Windows上本机运行(至少32位).工具链和生成的二进制文件都独立于Cygwin.

Cygwin中提供的MinGW编译器是不同的:它们是在Cygwin平台上构建的,用于生成不依赖于Cygwin运行时的代码.在这种情况下,编译器本身依赖于Cygwin.但那是因为你是从Cygwin安装的.



2> Brad Gilbert..:

GCC 的Cygwin版本要求安装Cygwin,用于编译的程序.

MinGW的版本不需要编译后的任何其他比Windows的工作副本.

你不能真正将Cygwin环境和MinGW编译器混合在一起,因为Cygwin改变了预编译库的路径.

如果你需要一个bash风格的shell,但又不想使用Cygwin,我会推荐MSYS.

Cygwin与MinGW形成鲜明对比

从MinGW Wiki复制而来

原则上Cygwin应用程序不被视为"Native Win32应用程序",因为它依赖于Cygwin®POSIXEmulation DLL或cygwin1.dllPosix函数,并且不直接使用win32函数.另一方面,MinGW提供Win32 API提供的功能.在MinGW下移植应用程序时,函数不是Win32本机的fork(),mmap()或者ioctl()需要重新实现到Win32等效项,以使应用程序正常运行.



3> AJ S...:

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页



4> Walter Brigh..:

我尝试让我在Windows下运行的程序像一个好的Windows公民,在Linux下就像一个好的Linux公民.


和往常一样,沃尔特,你就是男人!感谢您在两个平台上创建一个非常易于使用的编译器!注意:对于阅读此评论的其他人,Walter是D编程语言的"dmd"编译器的作者(我在原始帖子中将其作为跨平台编码的一个很好的例子).
推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有