Ich bin neu in C ++ und habe mit dem Kompilieren / Herstellen / Verknüpfen / Bauen / was auch immer zu tun gehabt, lassen Sie uns sehen, ob mir jemand helfen kann. Ich habe einige Suchen durchgeführt und andere Leute mit ähnlichen Problemen gefunden, aber ich habe ihre Lösungen ohne Glück versucht, also hier:
Ein einfaches C ++ - Programm, das C ++ 11-Funktionalität wie uniforme Initialisierung, Threads, to_string
usw. verwendet, erzeugt Fehler, die "xxx" im Bereich nicht deklariert wurden. Genau jetzt möchte ich to_string
verwenden, und die Verwendung im std
Namespace oder speziell std::to_string
erzeugt den Fehler "to_string" ist kein Mitglied von STD . Es ist also klar, dass es nicht mit C ++ 11 kompiliert.
Also hier ist meine Make-Datei:
%Vor% Wie Sie sehen können, spiele ich mit OpenCV auf einem Raspberry Pi. Aber ohne die C ++ 11 Funktionen kompiliert das Programm und läuft keine Probleme. Aber ich möchte Threads und andere Goodies aus C ++ 11 hinzufügen. Ich habe die Zeile set_property(TARGET main PROPERTY CXX_STANDARD_REQUIRED 11)
entsprechend der CMAKE-Dokumentation hinzugefügt:
Und es machte keinen Unterschied in den generierten Fehlern. Ich habe es zuerst ohne _REQUIRED
gemacht und dann damit. Ich probierte auch target_compile_features()
, aber CMAKE kam mit "unbekanntem CMAKE-Befehl" zurück.
Weitere Details: Auf einem Raspberry Pi 3 läuft debian jessie -CXX-Compiler ist GNU 4.9.2 -CMAKE 3.0.2
In CMake-Versionen früher als 3.1 verwenden wir
%Vor%zum Hinzufügen von Kompilierungsoptionen zum Compileraufruf, wie in den CMake-Dokumenten beschrieben.
Das ist wahrscheinlich nicht so tragbar wie das in Alvaro's Antwort, aber es ist lesbarer und da Sie auf RasPi sind, denke ich, werden GCC und Clang als Ziel-Compiler tun.
Bearbeiten: Der Vollständigkeit halber: Wenn Sie in der CMake-Version 3.1 und neuer C ++ 11 erzwingen möchten, benötigen Sie folgende Zeilen: p> %Vor%
Dies aktiviert die Optionen für alle Ziele während der Kompilierung. Wenn Sie dies feinkörniger steuern möchten, lesen Sie Alvaros Antwort oder die CMake-Dokumente von set_taget_properties()
, die dann ungefähr so aussehen:
Bearbeiten: Aber Vorsicht, dass die C ++ 11-Unterstützung in GCC 4 nicht vollständig ist und es möglicherweise Dinge gibt, die sich von dem definierten Standard unterscheiden.
CMeine Unterstützung für die Eigenschaften CXX_STANDARD
und CXX_STANDARD_REQUIRED
für Version 3.1 hinzufügen.
CXX_STANDARD
: Nimm einen von CMAKE_CXX_STANDARD
-Werten und sie sind 98, 11 and 14
.
Wenn Sie CXX_STANDARD 11
übergeben und Ihr Compiler c ++ 11 nicht unterstützt
CXX_STANDARD
werden automatisch 98 und cmake gibt Ihnen keine
Fehler, wenn CXX_STANDARD_REQUIRED
OFF
oder nicht gesetzt ist.
Wenn Ihr CXX_STANDARD_REQUIRED "ON" CXX_STANDARD
spezifischer Wert als eine erforderliche Eigenschaft zum Erstellen festgelegt wird und CMake dies handhabt.
Um CHECK_CXX_COMPILER_FLAG
zu verwenden, müssen Sie das CheckCXXCompilerFlag-Modul einschließen:
Wenn Sie einen alten cmake haben, brauchen Sie Griff komplizieren und nicht tragbare Flaggen von Compilern sush als:
%Vor%Da die aktuelle cmake-Version 3.10 ist, dachte ich, dass es vielleicht angebracht ist, die neuere Methode zu identifizieren. Während der Vorschlag, add_compiler _
zu verwendenFür jeden, der sich hier eine modernere Version von cmake (3.1+) ansieht, ist die am besten geeignete Antwort, keine Version eines bestimmten Compilers zu identifizieren, sondern CMAKE mitzuteilen, welche Features verfügbar sein müssen.
%Vor%Ich aktiviere immer C ++ 11 in meinem Code mit CMake auf diese Weise:
%Vor%Mein Compiler ist gcc (Debian 4.9.2-10) 4.9.2, aber an meinem Arbeitsplatz verwende ich auch andere Versionen und dieser Ansatz funktioniert immer.
EDIT (um das Überschreiben von Variablen zu vermeiden):
%Vor%