Fragen zum Verknüpfen von Bibliotheken in C.


8

Ich lerne C (noch sehr Anfänger) unter Linux mit dem GCC-Compiler. Ich habe festgestellt, dass einige Bibliotheken, wie die mit dem math.hHeader 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 -lmfür die oben erwähnte Mathematikbibliothek.

Nachdem jedoch von der Kommandozeile Schalten und / oder Geanyzu Code::Blocks, bemerkte ich , dass Code::BlocksAnwendungen , g++die Programme statt dem kompilieren , gccdass ich gewohnt bin (auch wenn das Projekt auf jeden Fall als C angegeben ist). Außerdem Code::Blocksmü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?


1
Ich vermute, dass Code: Blocks einige Umgebungsvariablen festlegt, um Pfade für die Bibliothek in ihrer Build-Umgebung zu suchen, oder diese Informationen hinzufügt, wenn sie den Compiler aufruft. Sie könnten ähnliche Ergebnisse in der Befehlszeile erhalten. Höchstwahrscheinlich gibt es in Code: Blocks einige Einstellungsoptionen, mit denen Sie solche Details zu Ihrer Build-Umgebung definieren können. Wenn Sie ähnliche Informationen in .bashrc (oder andere INI-Skripte) einfügen, erhalten Sie dieselben Ergebnisse. Setzen Sie Code: Blocks kompilieren Sie die Ausgabe möglicherweise auf ausführlich (wenn dies möglich ist), um zu sehen, was genau sie tut.
Thorsten Müller

Ich nehme an, dieser Link wird Ihnen helfen, warum wir beim Kompilieren mit g ++ die Mathematikbibliothek nicht manuell verknüpfen müssen: stackoverflow.com/questions/1033898/…

Antworten:


6

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.


3

Ist es "schlecht", C-Programme mit dem g ++ - Compiler zu kompilieren?

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.

Zweitens ist es der g ++ - Compiler, der die automatische Verknüpfung der Bibliotheken in Code :: Blocks vornimmt?

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 libmist ein ganz besonderer Fall (einige argumentieren, dass die Tatsache, dass gcc sie nicht standardmäßig verknüpft, ein Fehler in gcc ist).


+1 für "Einige werden argumentieren, dass die Tatsache, dass gcc es nicht standardmäßig verknüpft, ein Fehler in gcc ist". Ich bin auf dasselbe Problem mit derselben Bibliothek gestoßen und bin hierher gekommen, um zu fragen, was der Unterschied zwischen den beiden Compilern ist.
Herr Lister
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.