Ich lerne C (noch sehr Anfänger) unter Linux mit dem GCC-Compiler. Ich habe festgestellt, dass einige Bibliotheken, wie die mit dem math.h
Header verwendete Bibliothek, manuell verknüpft werden müssen, wenn sie enthalten sind. Ich habe in den Bibliotheken mit verschiedenen Flags des Formulars verlinkt -l[library-name]
, beispielsweise -lm
für die oben erwähnte Mathematikbibliothek.
Nachdem jedoch von der Kommandozeile Schalten und / oder Geany
zu Code::Blocks
, bemerkte ich , dass Code::Blocks
Anwendungen , g++
die Programme statt dem kompilieren , gcc
dass ich gewohnt bin (auch wenn das Projekt auf jeden Fall als C angegeben ist). Außerdem Code::Blocks
müssen die Bibliotheken beim Kompilieren nicht manuell verknüpft werden - Bibliotheken wie die Mathematikbibliothek funktionieren einfach .
Ich habe zwei Fragen:
Ist es "schlecht", C-Programme mit dem g++
Compiler zu kompilieren ? Bisher scheint es zu funktionieren, aber schließlich ist C ++ nicht C und ich bin mir ziemlich sicher, dass der g++
Compiler für C ++ gedacht ist.
Zweitens ist es der g++
Compiler, der die automatische Verknüpfung der Bibliotheken in übernimmt Code::Blocks
?
Antworten:
Sowohl gcc als auch g ++ sind Frontends der GNU-Compilersammlung. Ersteres sollte zum Kompilieren und Verknüpfen von C-Code und letzteres zum Ausführen derselben Aktionen für C ++ - Code verwendet werden. Eines der stärksten Argumente für die Aufrechterhaltung der Unterscheidung ist, dass C keine Teilmenge von C ++ ist .
Wenn Sie mit g ++ verknüpfen, wird automatisch eine Verknüpfung in der C ++ - Standardbibliothek hergestellt. Da die C-Standardbibliothek Teil der C ++ - Standardbibliothek ist, ist auch die Mathematikbibliothek enthalten. Aus diesem Grund müssen Sie die Mathematikbibliothek nicht manuell verknüpfen.
quelle
Definieren Sie "schlecht".
Es gibt einige Dinge, die dazu führen können, dass ein gültiges C-Programm in C ++ mit einer anderen Semantik kompiliert wird. Wenn meine Erfahrung einschlägt, haben Sie mehr Chancen, UB beim Ändern der Version Ihres C-Compilers anders zu behandeln, als sie zu erfüllen.
Ein C ++ - Compiler kompiliert einige gültige C-Programme nicht. Wenn Sie also C mit einem C ++ - Compiler kompilieren, beschränken Sie sich auf die gemeinsame Teilmenge, die eine strengere Version von C darstellt. Die Beschränkung auf diesen C-Dialekt ist nicht idiomatisch (der Hauptunterschied ist der müssen void * umsetzen, wenn ein anderer Zeigertyp benötigt wird), aber einige Projekte haben begonnen, C ++ auf diese Weise zu verwenden. Sie verwendeten einen C ++ - Compiler, um eine typsicherere Version von C zu erhalten, und beschlossen dann, die Verwendung der zusätzlichen Funktionen nacheinander zuzulassen, da sie dies für relevant hielten. (Das neueste und öffentlichere Beispiel ist gcc selbst. GCC wurde in K & R C geschrieben, beauftragte dann einen ANSI C-Compiler, war dann auf die gemeinsame Teilmenge von ANSI C und C ++ beschränkt, und jetzt beginnen sie, C ++ zu verwenden, eine andere Ein recht öffentliches Beispiel ist, dass die Beispiele in der zweiten Ausgabe von K &
Beachten Sie, dass Sie schnell C ++ - Abhängigkeiten einführen, wenn Sie nur C ++ - Compiler verwenden.
Beachten Sie auch, dass die neuen Funktionen in C99 und C11 in C ++ stärker voneinander abweichen.
Bei der Verknüpfung verknüpft ein Compiler immer einen Standardsatz von Bibliotheken. Dieser Satz für gcc enthält nicht libm, sondern ist im Standardsatz für g ++ enthalten. G ++ erkennt zusätzliche Bibliotheken nicht automatisch, wenn sie benötigt werden (AFAIK und Code :: Blocks auch nicht). Dies
libm
ist ein ganz besonderer Fall (einige argumentieren, dass die Tatsache, dass gcc sie nicht standardmäßig verknüpft, ein Fehler in gcc ist).quelle