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.?
c++
c
gcc
compilation
vehomzzz
quelle
quelle
Antworten:
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 ++':
Der schwierige Teil, weil er plattformspezifisch ist, ist die Bedeutung von 'CC' (und 'cc').
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.
quelle
CC
ist 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/cc
hingewiesen, der tatsächliche c-Konformist (Treiber). Zeigt auf Linux-PlattformenCC
fast immer auf/usr/bin/gcc
.gcc
ist 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 wiegcc
, jedoch mit einigen speziellen Optionen zum Kompilieren von C ++. Insbesondere (meiner Erfahrung nach)g++
wird libstdc ++ standardmäßig verknüpft, während diesgcc
nicht der Fall ist .quelle
./configure
+make
eine Umgebungsvariable mit dem NamenCC
C verwenden kann, um den verwendeten C-Compiler zu beeinflussen, aber ansonsten gibt es im Allgemeinen keine Umgebungsvariable mit diesem Namen.Ich möchte nur eine Information hinzufügen, was cc in Linux. Es ist mit gcc verbunden. Um es zu überprüfen.
Ähnlich verhält es sich mit c ++.
quelle