Ich hatte fälschlicherweise diesen Befehl verwendet, der beim Verknüpfungsschritt fehlschlug:
$ clang -std=c++11 -stdlib=libc++ myInputFile.cpp
Kann jemand erklären, warum Clang eine C++-Sprachoption bietet und warum es nicht verknüpft werden kann? Warum nicht die Optionen -x c++
oder -std=c++11
dasselbe erreichen wie clang++
? Vielen Dank!
Technisch keines der genannten Programme clang
oder clang++
ist ein Compiler: sie sind beides Fahrer die die Eingabeargumente analysieren und bestimmen, welche Compiler/Assembler/Linker für welche Dateien mit welchen Befehlszeilenargumenten aufgerufen werden sollen. Der einzige Unterschied zwischen den beiden ist das clang
linkt nur gegen die C-Standardbibliothek, wenn sie einen Link durchführt, wohingegen clang++
Links gegen die C++- und C-Standardbibliotheken.
Das -x=<language>
Option überschreibt die Heuristik der Treiberprogramme zur Bestimmung der Quelldateisprache, sie weist den Treiber an, den Compiler für aufzurufen <language>
trotzdem.
Das -std=<dialect>
Option wählt aus, welchen Dialekt einer bestimmten Sprache Sie verwenden möchten. Wenn Sie sicherstellen müssen, dass Ihr C++-Programm auf einen alten C++98-Compiler portierbar ist, können Sie es mit kompilieren -std=c++98
. -std
gilt nur für die Zielsprache: Es wird nicht versucht, zB Assembler oder Java als C++98 zu kompilieren, sondern nur Quelldateien, die der Treiber für C++ hält.
Kurz gesagt, es gibt zwei verschiedene Treiberprogramme, um die Auswahl der zu verknüpfenden Bibliotheken zu vereinfachen. Es gibt vernünftige Anwendungsfälle für das Kompilieren von C++, aber nicht für das Linken mit der C++-Standardbibliothek.
Clang ist der Name des gesamten Compilers.
Aus Sicht der Befehlszeile gilt jedoch:
- Clang ist der C-Compiler
- Clang++ ist der C++-Compiler (wie g++ ein C++-Compiler ist, während gcc ein C-Compiler ist)
Die Option -std=c++11 aktiviert den neuen C++11-Standard (wie in g++).
Was hat es mit den Downvotes auf sich? Ja, ich verstehe, dass clang++ nur ein Link ist, um clang für C++ zu konfigurieren. Das ist nicht meine Frage, bitte schauen Sie noch einmal. Wenn es Also Einfach, bitte antworten Sie nur, anstatt abzustimmen.
– djwbraun
18. November 2013 um 12:35 Uhr
Diese Frage in ihrer 4. Überarbeitung ist eine vollkommen gültige Frage, bei der ich keinen Grund sehe, für eine Schließung oder Ablehnung zu stimmen. Es ist ein „Warum…?“ Frage, aber ihr Umfang ist klein genug, dass Hoffnung besteht, dass eine allgemein vereinbarte Begründung als Antwort angeboten wird.
– Pascal Cuoq
18. November 2013 um 13:00 Uhr
Sollte
std=c++11 stdlib=libc++
in der Frage sein-std=c++11 -stdlib=libc++
?– Eric Postpischil
18. November 2013 um 14:57 Uhr
Welche Fehlermeldung erhalten Sie, wenn Sie versuchen, zu verlinken? Verlinken Sie mit dem Befehl in der Frage oder einem anderen Befehl?
– Eric Postpischil
18. November 2013 um 14:58 Uhr
@EricPostpischil Du hast Recht; das ist, was ich bekomme, wenn ich nicht kopiere/einfüge. Ich habe die Frage ein letztes Mal bearbeitet, um dies widerzuspiegeln.
– djwbraun
19. November 2013 um 1:56 Uhr