2008-10-09 29 views
36

Ich bin kein C++ - Entwickler, aber ich war schon immer an Compilern interessiert, und ich bin daran interessiert, mit einigen der GCC-Sachen (insbesondere LLVM) zu experimentieren.Warum hängt GCC-Windows von Cygwin ab?

Unter Windows erfordert GCC, dass eine POSIX-Emulationsebene (Cygwin oder MinGW) ordnungsgemäß ausgeführt wird.

Warum ist das?

Ich benutze viele andere Software, in C++ geschrieben und für verschiedene Plattformen (Subversion, Firefox, Apache, MySQL) kompiliert, und keiner von ihnen erfordert Cygwin oder MinGW.

Mein Verständnis von C + + Best-Practice-Programmierung ist, dass Sie vernünftigerweise plattformneutralen Code schreiben und alle Unterschiede während des Kompilierungsprozesses behandeln können.

Also, was ist der Deal mit GCC? Warum kann es nicht nativ unter Windows ausgeführt werden?


EDIT:

Okay, die beiden Antworten bisher sagen, im Grunde, "GCC verwendet die Posix-Schicht, weil es den Posix-Header verwendet".

Aber das beantwortet nicht wirklich die Frage.

Nehmen wir an, ich habe bereits eine Reihe von Headern für meine Lieblings-Standardbibliothek. Warum brauche ich noch die Posix-Header?

Benötigt GCC cygwin/mingw, um tatsächlich RUN?

Oder benötigt es nur die Emulationsschicht für Header und Bibliotheken? Wenn ja, warum kann ich ihm nicht einfach ein "lib" -Verzeichnis mit den erforderlichen Ressourcen geben?


Erneut bearbeiten:

Okay, werde ich versuchen, wieder die Frage zu klären ...

ich auch Code in the D Programming Language schreiben. Der offizielle Compiler heißt "dmd" und es gibt offizielle Compiler-Binärdateien für Windows und Linux.

Die Windows-Version erfordert keine POSIX-Emulation. Und die Linux-Version benötigt keine Win32-Emulation. Wenn der Compiler Annahmen über seine Umgebung hat, verbirgt er diese Annahmen ziemlich gut.

Natürlich muss ich dem Compiler sagen, wo die Standardbibliothek zu finden ist und wo Bibliotheken zu statisch oder dynamisch zu finden sind.

GCC dagegen besteht darauf, so zu tun, als würde es in einer Posix-Umgebung arbeiten, und es fordert mich auf, diese Annahmen zu treffen, indem ich eine Emulationsebene aufstelle.

Aber was genau, innerhalb GCC beruht auf dieser Schicht? Sucht es nur nach stdlib-Headern und geht davon aus, dass es diese Header in "/ usr/lib" finden wird?

Wenn das der Fall ist, sollte ich nicht in der Lage sein, es in "C:/gcc/lib" zu suchen, um diese Header-Dateien zu finden?

Oder ist GCC selbst auf die POSIX-Bibliotheken angewiesen, um auf das Dateisystem zuzugreifen (und andere Low-Level-Sachen zu machen)? Wenn das der Fall ist, dann wundere ich mich, warum sie nicht nur statisch mit ihren Lieblings-Windows-POSIX-Bibliotheken verlinken. Warum muss der Benutzer die Abhängigkeiten einrichten, wenn er diese Abhängigkeiten direkt in die Anwendung einbauen könnte?

+0

Es gibt mehrere * richtige * Antworten zur Auswahl. MinGW benötigt keine cygwin1.dll. Wenn Sie wissen möchten, was das Kern-GCC-Team Microsoft Windows nicht unterstützt, sollten Sie das fragen. –

+0

Nicht zu erwähnen, dass es so viel Sinn wie diese Frage macht: Warum brauchen Sie WINE oder etwas, um Visual Studio und VC++ unter Linux zu betreiben? –

Antwort

2

Viel von dieser Software, die für verschiedene Plattformen kompiliert wird, ist kompiliert ... in MinGW. Der einzige Unterschied zu gcc ist, dass es ein Compiler selbst ist, was bedeutet, dass es alle Header benötigt, die normalerweise mit dem Programm kompiliert werden, und normalerweise, welches das resultierende Programm nicht ausführen muss.

+1

Diese Antwort ist ein wenig verwirrend. –

3

Windows bietet keine POSIX-Standardbibliothek, daher stellt Cygwin eine (cygwin1.dll) bereit. Die gcc-Pakete, die mit Cygwin geliefert werden, verwenden es.

Mingw, auf der anderen Seite, muss nicht unbedingt eine POSIX-Schicht bereitstellen. Die Mingw-Installation, die ich verwende, hat zum Beispiel nicht einmal eine Pthread-Bibliothek.

Sollte ich es brauchen, müsste ich es installieren. Mingw-gcc erzeugt nativen Win32-Code (und stützt sich tatsächlich auf MSVCRT.DLL).

EDIT: Lesen Sie Ihre bearbeiten ich nicht mehr bin sicher, wenn Sie fragen, warum gcc selbst mingw/Cygwin-Bibliotheken benötigt oder wenn die mit gcc kompilierten Programmen auf Win diese Bibliotheken erfordern

+0

Meine Frage könnte so umformuliert werden: Warum sollte ich als Benutzer von GCC zuerst eine POSIX-Emulationsebene auf meinem Rechner installieren müssen? – benjismith

+1

@benjismith: Oder warum sollte ich als Benutzer von Visual Studio zuerst eine Windows-Emulationsschicht auf meiner Linux-Maschine installieren müssen? Beide Fragen scheinen mir ungefähr dieselbe Bedeutung zu haben. –

+0

@ David, Sie haben nicht den Quellcode für Visual Studio, also müssen Sie angeben, was die Binärdateien erfordern. Sie haben den Quellcode von Gcc, also sollte es in der Lage sein, ohne die Anforderung einer Emulationsschicht gebaut zu werden. Was ich vermute, ist was MinGW tut. –

37

Eigentlich ist die Frage Prämisse ist, falsch: MinGW GCC tut NICHT erfordern Cygwin.

Sie werden sehen, dass Sie Cygwin überhaupt nicht brauchen. Es läuft nativ unter Windows (mindestens 32-Bit). Sowohl die Toolchain als auch die erzeugten Binärdateien sind unabhängig von Cygwin.

Die in Cygwin verfügbaren MinGW-Compiler unterscheiden sich: Sie basieren auf der Cygwin-Plattform, um Code zu generieren, der nicht von der Cygwin-Laufzeit abhängt. Die Compiler selbst hängen in diesem Fall von Cygwin ab. Aber das liegt daran, dass Sie sie von Cygwin installiert haben.

5

Ich versuche, meine Programme unter Windows verhalten sich wie ein guter Windows-Bürger, und unter Linux wie ein guter Linux-Bürger.

+5

Wie immer, Walter, du bist der Mann! Danke, dass Sie auf beiden Plattformen einen sehr einfach zu verwendenden Compiler erstellt haben! HINWEIS: Für andere, die diesen Kommentar lesen, ist Walter der Autor des "dmd" Compilers für die D-Programmiersprache (die ich als ein gutes Beispiel für plattformübergreifende Codierung in meinem ursprünglichen Beitrag bezeichnet). – benjismith

+0

MingW erreicht dieses Ziel weitgehend. –

+0

@Brad, aber ohne die Hilfe der Kern-GCC-Entwickler. – RBerteig

29

Die Cygwin Version von GCC erfordert Cygwin installiert werden, für die Programme kompiliert.

Die MinGW Version erfordert nichts nach dem Kompilieren, außer einer Arbeitskopie von Windows.

Sie können die Cygwin-Umgebung und die MinGW-Compiler nicht wirklich miteinander kombinieren, da Cygwin die Pfade der vorkompilierten Bibliotheken ändert.

Wenn Sie eine Bash-Stil-Shell benötigen, aber nicht Cygwin verwenden möchten, empfehle ich MSYS.

Cygwin im Gegensatz zu MinGW

von MinGW Wiki kopiert

Cygwin-Anwendungen durch Prinzip sind keine "native Win32-Anwendung" betrachtet, weil es auf die Funktionen Cygwin® POSIX Emulation DLL oder cygwin1.dll für Posix beruht und verwendet Win32-Funktionen nicht direkt. MinGW stellt Funktionen zur Verfügung, die von der Win32-API bereitgestellt werden. Beim Portieren von Anwendungen unter MinGW müssen Funktionen, die Win32 nicht nativ sind, wie fork(), mmap() oder ioctl(), in Win32-Äquivalente neu implementiert werden, damit die Anwendung ordnungsgemäß funktioniert.

7

POSIX (Portable Operating System Interface) "ist eine sich entwickelnde, wachsende Dokument, das von IEEE und standardisiert durch ANSI und ISO produziert wird. Das Ziel von POSIX ist die Quelle-Code Portabilität der Applikation" [1].

In der Praxis ist das Ziel definiert als die Fähigkeit, eine Quellimplementierung zu schreiben und sie auf verschiedenen (POSIX-kompatiblen) Systemen mit nur Neukompilierung ausführen zu lassen.

GCC ist ein Compiler, der dieses Versprechen einlösen kann und daher eine Codeebene benötigt, die eine Maschine POSIX-konform macht.

Das ist der Kern der Antwort auf Ihre Frage.

Um zu sehen, was ich meine, werde ich Ihnen diese Übung bieten:

  • ein Programm ohne OS-spezifische #ifdefs schreiben, die von dem Benutzer eine Verzeichnispfad als Eingabe und schreibt eine nach stdout Auflistung seiner Inhalte (eine Ebene).

Ich glaube, Sie werden feststellen, dass es sehr schwierig ist, Code zu schreiben, nur das native Win32-API verwendet, die

auf jedem UNIX- oder Linux-System kompiliert nur Es wird etwas weniger schwierig Code zu schreiben, verwendet POSIX-API - wie Sie es bei jeder LINUX-Box können - und es unter Windows kompilieren lassen (DevStudio2005 hat jetzt eine überraschende Anzahl von POSIX-konformen Headern ... Sie könnten vielleicht in der Nähe sein).

Nehmen Sie LINUX-Programm von oben und kompilieren Sie es jetzt unter GCC unter Cygwin oder MinGW. Ich wette, es kompiliert und läuft.

Wie hat GCC dieses bisschen Magie durchgeführt? Die zugrunde liegenden POSIX-Header und Implementierungen werden von Cygwin oder MinGW bereitgestellt.

Macht das Vertrauen von GCC auf Cygwin/MinGW unter Windows jetzt mehr Sinn?

  1. POSIX.4: Programmierung für die wirkliche Welt, Bill O. Gallmeister, O'Reilly & Associates, Inc., S. 2
4

Warum? Denn wenn GCC erstellt wurde, Windows 32 Bit hatte sogar keine Ausgänge ...

Um richtiger zu sein --- es wurde für UNIX/Posix OS entwickelt. Später wurde es zu Windows portiert.

Windows ist kein POSIX-kompatibles System.Es bietet sogar keine grundlegende Funktionalität. Versuchen Sie readdir oder stat unter Windows-Compiler zu finden? Und das ist so extrem grundlegende Funktionalität, die Sie Compiler schreiben müssen!

Nur um klar zu sein, benötigt GCC kompilierte Programme in der Regel nur eine mingw32.dll, um fehlende Funktionalität hinzuzufügen, um ausgeführt werden zu können.

Also ... Sie fragen, warum GCC eine POSIX-Schicht benötigt? Weil Windows OS kein POSIX-Betriebssystem ist.

+1

Fast total falsch. Windows ist (minimal) POSIX-konform, es wurde eine Konformitätsbescheinigung ausgestellt. Und 'readdir' und' stat' gehören zu den Funktionen * least *, die wahrscheinlich von einem Compiler verwendet werden. –

+0

@Ben Voigt - Windows (mininal) POSIX-Kompatibilität ist ein Witz. Seine ** Minimalität ** macht es völlig nutzlos und hilft nicht bei der Portierung von Software. Und Operationen des Dateisystems für C- oder C++ - Compiler sind sehr kritisch und wichtig. – Artyom

+0

@Artoym: Die Wahrheit ist, der Grund, dass einige Anwendungen über ein breites Spektrum von Unix-ähnlichen Betriebssystemen kompilieren, aber nicht Win32, weil sie die SUS-API (Single Unix Specification) und nicht nur die POSIX-API benötigen. Und die einzigen Dateisystemoperationen, die für einen Compiler benötigt werden, sind offene Dateien, Lese-, Schreib-, Schließ- und möglicherweise Suchfunktionen, außerdem sind diese Teile Teil von POSIX und werden vollständig von Windows unterstützt. Keine Notwendigkeit für Verzeichnisauflistungen, keine Notwendigkeit, Dateizeitstempel zu überprüfen (die Shell kümmert sich um globbing, das 'make'-Dienstprogramm kümmert sich um die Überprüfung auf geänderte Abhängigkeiten, keiner von diesen ist Teil des Compilers). –

3

Ich bin kein C++ Entwickler, aber ich habe immer in Compilern interessiert, und ich bin daran interessiert, mit Sachen einige der GCC (insbesondere LLVM) in Bastelei

Beachten Sie, dass LLVM und GCC nicht verwandt sind. LLVM ist größtenteils das Ergebnis der Forschung von Chris Lattner (http://llvm.org/developers.cgi) über moderne Optimierung. Seine Papiere sind verfügbar unter http://llvm.org. Heutzutage wird es stark von Apple gesponsert. Das C/C++/Obj-C-Frontend von GCC wird für llvm-gcc verwendet, das LLVM-Maschinencode ausgibt (und nach einer Menge Optimierungen in llvm kommt eine endgültige ausführbare Datei heraus); llvm-gcc ist eine Art Hack, um einige fertige C/C++/Obj-C-Frontends mit LLVM zu verbinden.

Beachten Sie, dass die LLVM-Crew auch einen eigenen, vollständigen C/C++/Obj-C-Compiler namens clang erstellt. Es ist C-Implementierung ist fast abgeschlossen, C++ - Unterstützung wird immer besser, weiß aber nicht über Obj-C.

Also, wenn jemand "Compiler llvm" sagt, meint er entweder llvm-gcc oder clang. LLVM selbst ist nur die Low Level Virtual Machine, mit nur einer Handvoll Anweisungen in statischer Single-Assignment-Form (ca. 32 Anweisungen, afair), aber ein Megatonnen Optimierung geht an Ihrem Syntaxbaum vorbei.

-3

Weil die Leute, die GCC hassen, Windows mit einer Leidenschaft hassen (lesen Sie Stallman eines Tages). Wenn sie also GCC nach Windows portieren, tun sie ihr Bestes, um vorzutäuschen, dass es nur ein anderes Unix ist.

Das, und sie wahrscheinlich nicht Zeit zum Entfernen von POSIX-Abhängigkeiten aus dem Code verbringen wollen.

+3

Eher als Nehmen wir an, dass viele Leute hinter GCC keine GNU-Leute sind. Zwei bekannte, explizit nicht Unix-zentrierte Unternehmen sind Google und Oracle. Nehmen wir an, dass GCC * ein Compiler für Unix-Plattformen ist, anstatt Hass anzunehmen. MinGW ist "nur" ein Port zu einer der wenigen Nicht-Unix-Plattformen der Welt. * Eher, dass anspruchsvolle Beweise, bringen Sie Ihre eigenen Beweise an erster Stelle. * –

+1

Und übrigens, die meisten Open Source und Freie Software Menschen, die ich kenne (einschließlich mir) hasse keine Fenster (am lautesten! = Die Mehrheit). Wir haben keine Gefühle dafür, maximal haben wir Gefühle für seine Nutzer. –

+0

Nun, die lautesten durften bisher die Stimme der Bewegung sein. Was RMS betrifft, müssen Sie nicht viel Google finden, um eine Beschimpfung gegen proprietäre Software (Windows eingeschlossen) zu finden - versuchen Sie diese auf zum Beispiel: http://www.fsf.org/blogs/rms/can-we- rescue-olpc-from-windows –

0

Sie haben eine Option beim Erstellen von gcc, um enable-threads-Optionen außer posix anzugeben, wenn Sie pthreads oder OpenMP nicht unterstützen möchten. Unnötig zu sagen, dass diese nicht so gut getestet sind. Es gibt eine Closed Source-Unterstützung von Drittanbietern für OpenMP mit Windows-Threads, aber die Verwendung mit gcc scheint gegen die Lizenz zu verstoßen. Da die Windows Pthreads-Bibliothek eine Schnittstelle zur Windows-Threads-Funktionalität auf höherer Ebene ist, ist es vielleicht nicht überraschend, wenn sie nicht so gut funktioniert oder Microsofts Ablehnung der Affinitätsunterstützung trifft. Erst kürzlich hat Microsoft damit begonnen, gcc unter Windows zu tolerieren. Es gab eine Zeit, in der sie tatsächlich sagten, sie würden nicht an den Fehlern arbeiten, die von GCC-Benutzern gemeldet wurden, selbst wenn sie mit ausschließlich Microsoft-Tools reproduziert werden könnten.

Verwandte Themen