我不是C++开发人员,但我一直对编译器感兴趣,我对修改GCC的一些东西(特别是LLVM)很感兴趣。
在Windows上,GCC需要POSIX仿真层(cygwin或MinGW)才能正确运行。
为什么会这样呢?
我使用了许多其他的软件,用C++编写,并针对不同的平台(Subversion、Firefox、MySQL)进行交叉编译,而且它们都不需要cygwin或MinGW。
我对C++最佳实践编程的理解是,您可以合理地编写与平台无关的代码,并在编译过程中处理所有差异。
GCC是怎么回事?为什么不能在Windows上本地运行呢?
编辑:
好的,到目前为止,两个答复说,基本上,"GCC使用posix层,因为它使用posix头“。
但这并不能真正回答问题。
假设我已经为我最喜欢的标准库设置了一组标头。为什么我还需要posix头呢?
GCC是否要求赛格温/明实际运行?
还是只需要头部和库的仿真层?如果是这样的话,为什么我不能给它一个包含所需资源的"lib“目录呢?
再次编辑:
好吧,我再试着澄清这个问题.
我还用D语言编写代码。官方编译器名为"dmd“,Windows和linux都有官方的编译器二进制文件。
Windows版本不需要任何形式的POSIX仿真。而且Linux版本不需要任何形式的Win32仿真。如果编译器对其环境有假设,那么它很好地隐藏了这些假设。
当然,我必须告诉编译器在哪里可以找到标准库,在哪里可以找到静态或动态链接的库。
相比之下,GCC坚持假装它是在posix环境中运行的,它要求我通过建立一个模拟层来幽默这些假设。
但是,GCC的内心到底依赖于哪一层呢?它是否只是在寻找stdlib头,并且假设它会在"/usr/lib“中找到这些标头?
如果是这样的话,难道我不能告诉它在"C:/gcc/lib“中查找那些头文件吗?
还是GCC自己依赖POSIX库来访问文件系统(以及做其他低级的事情)?如果是这样的话,我想知道为什么他们不只是静态地链接到他们最喜欢的windows POSIX库。当用户可以将依赖关系直接构建到应用程序中时,为什么需要用户设置依赖项呢?
发布于 2008-10-26 12:36:21
其实,问题的前提是错误的:MinGW GCC做而不是需要Cygwin。
你会发现你根本不需要Cygwin。它在Windows上本地运行(至少32位)。工具链和产生的二进制文件都独立于Cygwin。
Cygwin中可用的MinGW编译器是不同的:它们构建在Cygwin平台上,以生成不依赖Cygwin运行时的代码。在这种情况下,编译器本身确实依赖Cygwin。但那是因为你是从Cygwin安装的。
发布于 2008-11-04 10:48:19
我试着让我的程序在Windows下表现得像一个好的Windows公民,在Linux下像一个好的Linux公民。
发布于 2009-04-19 03:43:18
POSIX (,便携式操作系统接口)是一个不断发展、不断发展的文档,由IEEE生产,ANSI和ISO标准化,POSIX的目标是实现应用程序的源代码可移植性。
在实践中,目标被定义为能够编写一个源代码实现,并让它在不同的(POSIX兼容的)系统上运行,只需重新编译。
GCC是一个能够实现这一承诺的编译器,因此,它需要一层代码来使机器“达到”POSIX标准。
这是回答你问题的核心。
为了理解我的意思,我会给你这个练习:
我想您会发现,编写只使用在任何UNIX或LINUX系统上编译的本地WIN32 API的代码是非常困难的。
编写使用POSIX API的代码--就像在任何LINUX上一样--并让它在Windows下编译(DevStudio2005有数量惊人的符合POSIX的标头,now...you可能可以接近)。
从上面的LINUX程序,现在编译它在GCC下运行的Cygwin或MinGW。我敢打赌它会编译和运行。
GCC是如何做到这一点的?由Cygwin或MinGW提供的POSIX及其底层实现。
GCC在Windows下对Cygwin/MinGW的依赖现在更有意义了吗?
https://stackoverflow.com/questions/187990
复制相似问题