Unterschied zwischen CC, gcc und g ++?

104

Was ist der Unterschied zwischen den 3 Compilern CC, gcc, g ++ beim Kompilieren von C- und C ++ - Code hinsichtlich der Generierung von Assembler-Code, verfügbaren Bibliotheken, Sprachfunktionen usw.?

vehomzzz
quelle
1
Wie in meiner Antwort angegeben, hängt die Antwort auf Ihre Frage von der Plattform ab, aber die Plattform ist nicht angegeben.
Jonathan Leffler
3
Verwandte Frage: stackoverflow.com/questions/172587/…
Martin York

Antworten:

122

Die Antwort darauf ist plattformspezifisch. Was unter Linux passiert, unterscheidet sich beispielsweise von dem, was unter Solaris passiert.

Der einfache Teil (weil er nicht plattformspezifisch ist) ist die Trennung von 'gcc' und 'g ++':

  • gcc ist der GNU C Compiler aus dem GCC (GNU Compiler Collection).
  • g ++ ist der GNU C ++ - Compiler aus dem GCC.

Der schwierige Teil, weil er plattformspezifisch ist, ist die Bedeutung von 'CC' (und 'cc').

  • Unter Solaris ist CC normalerweise der Name des Sun C ++ - Compilers.
  • Unter Solaris ist cc normalerweise der Name des Sun C-Compilers.
  • Unter Linux ist CC, falls vorhanden, wahrscheinlich ein Link zu g ++.
  • Unter Linux ist cc ein Link zu gcc.

Selbst unter Solaris kann es jedoch sein, dass cc der alte BSD-basierte C-Compiler von ist /usr/ucb. In der Praxis wird dies normalerweise nicht installiert, und es gibt nur einen Stub, der fehlschlägt und denjenigen Schaden zufügt, die versuchen, selbstkonfigurierende Software zu kompilieren und zu installieren.

Unter HP-UX ist der Standardwert 'cc' immer noch ein K & R-only C-Compiler, der installiert ist, um das erneute Verknüpfen des Kernels bei Bedarf zu ermöglichen, und für moderne Softwarearbeiten unbrauchbar, da er Standard C nicht unterstützt. Sie müssen alternative Compilernamen verwenden ('acc' IIRC). In ähnlicher Weise trägt der System C-Compiler unter AIX Namen wie 'xlc' oder 'xlc32'.

Klassischerweise hieß der Standardsystem-Compiler 'cc' und selbstkonfigurierende Software greift auf diesen Namen zurück, wenn sie nicht weiß, was sie sonst verwenden soll.

POSIX versuchte, dies zu umgehen, indem die Programme c89 (ursprünglich) und später c99 existieren mussten. Dies sind die Compiler, die mit den Normen ISO / IEC 9899: 1989 und 9899: 1999 C kompatibel sind. Es ist zweifelhaft, ob POSIX erfolgreich war.


Die Frage fragt nach den Unterschieden in Bezug auf Funktionen und Bibliotheken. Nach wie vor ist die Antwort teilweise plattformspezifisch und teilweise generisch.

Die große Kluft besteht zwischen den C-Compilern und den C ++ - Compilern. Die C ++ - Compiler akzeptieren C ++ - Programme und kompilieren keine beliebigen C-Programme. (Obwohl es möglich ist, C in eine Teilmenge zu schreiben, die auch von C ++ verstanden wird, sind viele C-Programme keine gültigen C ++ - Programme). In ähnlicher Weise akzeptieren die C-Compiler C-Programme und lehnen die meisten C ++ - Programme ab (da die meisten C ++ - Programme Konstrukte verwenden, die in C nicht verfügbar sind).

Die verfügbaren Bibliotheken hängen von der Sprache ab. C ++ - Programme können normalerweise C-Bibliotheken auf einer bestimmten Plattform verwenden. C-Programme können normalerweise keine C ++ - Bibliotheken verwenden. In C ++ steht also eine größere Anzahl von Bibliotheken zur Verfügung.

Beachten Sie, dass unter Solaris der von CC erzeugte Objektcode nicht mit dem von g ++ erzeugten Objektcode kompatibel ist. Es handelt sich um zwei separate Compiler mit separaten Konventionen für Dinge wie Ausnahmebehandlung und Namensverwaltung (und die Namensverwaltung ist absichtlich anders, um sicherzustellen, dass inkompatible Objektdateien nicht miteinander verknüpft werden!). Dies bedeutet, dass Sie Ihr gesamtes Programm mit CC kompilieren müssen, wenn Sie eine mit CC kompilierte Bibliothek verwenden möchten. Es bedeutet auch, dass Sie kein Glück haben, wenn Sie eine mit CC kompilierte Bibliothek und eine mit g ++ kompilierte Bibliothek verwenden möchten. Sie müssen mindestens eine der Bibliotheken neu kompilieren.

In Bezug auf die Qualität des generierten Assemblers leistet die GCC (GNU Compiler Collection) sehr gute Arbeit. Aber manchmal arbeiten die nativen Compiler etwas besser. Die Intel-Compiler verfügen über umfangreichere Optimierungen, die meines Erachtens noch nicht in GCC repliziert wurden. Solche Pontifikationen sind jedoch gefährlich, obwohl wir nicht wissen, um welche Plattform es sich handelt.

In Bezug auf die Sprachfunktionen liegen die Compiler im Allgemeinen alle ziemlich nahe an den aktuellen Standards (C ++ 98, C ++ 2003, C99), aber es gibt normalerweise kleine Unterschiede zwischen der Standardsprache und der vom Compiler unterstützten Sprache. Die ältere C89-Standardunterstützung ist für alle C-Compiler im Wesentlichen gleich (und vollständig). Es gibt Unterschiede in den dunkleren Ecken der Sprache. Sie müssen "undefiniertes Verhalten", "systemdefiniertes Verhalten" und "nicht spezifiziertes Verhalten" verstehen. Wenn Sie undefiniertes Verhalten aufrufen, erhalten Sie zu unterschiedlichen Zeiten unterschiedliche Ergebnisse. Es gibt auch viele Optionen (insbesondere beim GCC), um das Verhalten des Compilers zu optimieren. Das GCC verfügt über eine Vielzahl von Erweiterungen, die das Leben einfacher machen, wenn Sie wissen, dass Sie nur auf diese Compilerfamilie abzielen.

Jonathan Leffler
quelle
1
Und unter OSX (mindestens Sierra 10.2) ist es ein Symlink zum Klirren.
Josh Kodroff
26

CCist eine Umgebungsvariable, die sich auf den C-Compiler des Systems bezieht. Worauf es hinweist (Bibliotheken zugänglich usw.), hängt von der Plattform ab. Oft wird darauf /usr/bin/cchingewiesen, der tatsächliche c-Konformist (Treiber). Zeigt auf Linux-Plattformen CCfast immer auf /usr/bin/gcc.

gccist die Treiberbinärdatei für die GNU-Compilersammlung. Es kann C, C ++ und möglicherweise andere Sprachen kompilieren. Es bestimmt die Sprache durch die Dateierweiterung.

g++ist eine Treiberbinärdatei wie gcc, jedoch mit einigen speziellen Optionen zum Kompilieren von C ++. Insbesondere (meiner Erfahrung nach) g++wird libstdc ++ standardmäßig verknüpft, während dies gccnicht der Fall ist .

Managu
quelle
1
Können Sie bitte erklären, was Sie unter "Treiberbinär" verstehen?
Edan Maor
5
Die meisten C-Compiler, aber speziell GCC, haben eine Reihe von Programmen, die die Kompilierungsarbeit erledigen. Es gibt ein Programm der obersten Ebene namens 'gcc', das der Compilertreiber ist. Es analysiert eine Vielzahl von Befehlszeilenoptionen und orchestriert die anderen Phasen des Compilers - normalerweise den Parser / Analysator, den Optimierer, den Assembler und den Linker (der Präprozessor ist heutzutage normalerweise keine separate Phase, es sei denn, Sie fordern nur eine Vorverarbeitung an). Es (der Compilertreiber) ist ein ziemlich komplexes Programm, obwohl es niemals eine C-Quelldatei selbst berührt.
Jonathan Leffler
3
CC ist auch der Sun C ++ - Compiler - und keine Umgebungsvariable.
Jonathan Leffler
1
Der C ++ - Compiler von SGI ist ebenfalls CC.
Alex Kribbeln
Nun, ich nehme an, Managu denkt, dass ./configure+ makeeine Umgebungsvariable mit dem Namen CCC verwenden kann, um den verwendeten C-Compiler zu beeinflussen, aber ansonsten gibt es im Allgemeinen keine Umgebungsvariable mit diesem Namen.
Ephemient
5

Ich möchte nur eine Information hinzufügen, was cc in Linux. Es ist mit gcc verbunden. Um es zu überprüfen. Geben Sie hier die Bildbeschreibung ein

Ähnlich verhält es sich mit c ++.

uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz  
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++
Uddhav Gautam
quelle