cmake wird nicht nach C ++ 11 Standard kompiliert

8

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

    
DrTarr 03.06.2016, 18:38
quelle

4 Antworten

24

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:

%Vor%

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.

    
Bugfinger 04.06.2016, 14:38
quelle
4

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:

%Vor%

Wenn Sie einen alten cmake haben, brauchen Sie Griff komplizieren und nicht tragbare Flaggen von Compilern sush als:

%Vor%     
Alvaro Denis Acosta 04.06.2016 14:14
quelle
0

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 verwenden

Fü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%     
Brian Bruggeman 24.12.2017 03:27
quelle
-2

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%     
Ptaq666 03.06.2016 18:55
quelle

Tags und Links