C++11 im CMake einbinden und auf Raspberry Pi nutzen



  • Hallo zusammen,

    ich habe ein Problem mit threads die ich gerne nutzen würde. jedoch wurde mir gesagt das ich auf c++11 den compiler umstellen/einstellen müsste.

    Ich arbeite mit dem Raspberry Pi und einem AD-Wandler (-> CEBO-LC) von CESYS.
    Die Datenerfassung habe ich mit C++ vorgenommen. Zum kompilieren wurde mir von CESYS ein fertiges CMake-File zur verfügung gestellt was ich nutze.
    Ein sequenzielles Programm läuft schon einwandfrei, doch nun möchte ich zusätzlich mit threads arbeiten um den Gesamtvorgang des Programmes zu beschleunigen.

    Dazu habe ich mit dem Support von CESYS geschrieben und diese meinten:
    In C++ empfehle ich Ihnen die Verwendung von std::thread (http://en.cppreference.com/w/cpp/thread/thread/thread) und std::async (http://en.cppreference.com/w/cpp/thread/async), dafür wird das PThread im Linux aber auch benötigt. Beide Sachen funktionieren aber nur, wenn Sie C++11 aktivieren (in CMAKE mit -> add_definitions("-std=c++11")).

    leider habe ich weder Ahnung von dem Compiler noch vom erstellen eines CMake-Files. Ich habe mal eine Anleitung überflogen um selbst darauf zu kommen was der Support meint, doch leider ohne Erfolg.

    Weiß jemand wie und wo ich das "-std=c++11" in das unten hinzugefügte CMake-File eintragen muss oder was für grundlegende Sachen ich Ändern muss damit ich std::thread nutzen kann?

    project(msrexamples) 
    cmake_minimum_required(VERSION 2.8) 
    cmake_policy(SET CMP0015 NEW) 
    
    set(VERSION 1.4) 
    
    # Short path to project. 
    set(ROOT ${CMAKE_HOME_DIRECTORY}) 
    
    # Check for 32 or 64 bit. 
    if(CMAKE_SIZEOF_VOID_P EQUAL 4) 
        set(HAVE_64_BIT 0) 
    else() 
        set(HAVE_64_BIT 1) 
    endif() 
    
    # Set target specific output path. 
    set(EXECUTABLE_OUTPUT_PATH ${ROOT}/bin) 
    set(LIBRARY_OUTPUT_PATH ${ROOT}/lib) 
    link_directories(${ROOT}/lib) 
    
    # Depending on tool-chain, define library path ... 
    # Visual Studio requires libs, either 32 or 64 bit. 
    if(MSVC) 
        if(HAVE_64_BIT) 
            set(LIB_NAME cebomsr-${VERSION}-x86_64) 
        else() 
            set(LIB_NAME cebomsr-${VERSION}-x86) 
        endif() 
        link_directories(${ROOT}/lib) 
    endif() 
    
    # MinGW directly links against the .DLL's, either 32 or 64 bit. 
    if(MINGW) 
        if(HAVE_64_BIT) 
            set(LIB_NAME cebomsr-${VERSION}-x86_64) 
        else() 
            set(LIB_NAME cebomsr-${VERSION}-x86) 
        endif() 
        link_directories(../runtime) 
    endif() 
    
    # POSIX links against .so . 
    if(UNIX) 
        link_directories(../runtime) 
        set(LIB_NAME cebomsr-${VERSION}) 
    endif() 
    
    # Include path is always constant. 
    include_directories(${ROOT}/api/) 
    
    # API is constant for all examples. 
    set(API_FILES ${ROOT}/api/cebomsrpp.cpp ${ROOT}/api/cebomsrpp.h ${ROOT}/api/cebomsr.h) 
    source_group(Api FILES ${API_FILES})    
    
    # The examples. 
    foreach(EX counter frameio info singleio streamingi trigger zz) 
        add_executable(${EX} ${ROOT}/examples/${EX}.cpp ${API_FILES}) 
        target_link_libraries(${EX} ${LIB_NAME}) 
    endforeach()
    

    Vielen lieben Danke schon mal für die Mühe 🙂



  • Ab Zeile 44:

    if(UNIX)
        link_directories(../runtime)
        set(LIB_NAME cebomsr-${VERSION})
    	add_definitions("-std=c++11")
    endif()
    


  • Und das kann ich dort so rein schreiben?
    Warum muss man das eigentlich aktivieren? Ich dachte immer eine neue version wird automatisch mit einem upgrade oder update gleich mit erledigt. Was hat das für einen Grund?

    Danke noch mal für die fixe antwort



  • Aus Status of Experimental C++11 Support in GCC 4.8:

    Since this standard has only recently been completed, the feature set provided by the experimental C++11 mode may vary greatly from one GCC version to another. No attempts will be made to preserve backward compatibility with C++11 features whose semantics have changed during the course of C++11 standardization.



  • C++11 bringt einige "breaking changes" mit. Also Änderungen die dazu führen dass Code der in C++03 OK war entweder gar nicht mehr compiliert, oder noch compiliert, aber auf einmal 'was anderes tut.

    Von daher ist es nur gut dass es nen Switch gibt um es zu steuern.
    Obwohl man es auch bald mal anders rum machen könnte - also opt-out statt opt-in.



  • hey hoo ... so .. nun konnte ich es probieren die threads mal einbinden zu können.
    ich habe mich für die Threads von c++ (std::threads) entschieden und funktioniert einwandfrei. Mit dem Hinweis von TyRoXx:

    if(UNIX)
        link_directories(../runtime)
        set(LIB_NAME cebomsr-${VERSION})
        add_definitions("-std=c++11")
    endif()
    

    hat alles wunderbar geklappt. Jedoch habe ich es mit:

    ...("-std=c++0x") ..
    

    geschrieben.
    ich habe mich auf die Seite bezogen und es funktioniert auch:
    https://solarianprogrammer.com/2011/12/16/cpp-11-thread-tutorial/

    Danke noch mal für die zahlreiche Hilfe 👍



  • hustbaer schrieb:

    C++11 bringt einige "breaking changes" mit. Also Änderungen die dazu führen dass Code der in C++03 OK war entweder gar nicht mehr compiliert, oder noch compiliert, aber auf einmal 'was anderes tut.

    Von daher ist es nur gut dass es nen Switch gibt um es zu steuern.
    Obwohl man es auch bald mal anders rum machen könnte - also opt-out statt opt-in.

    Ich bin da etwas skeptisch, weil es bestehende build-Systeme kaputtmachen könnte. Und neue C++ Versionen kommen in einem zu kurzen zeitlichen Abstand.
    Andererseits hat man jetzt bei gcc das Versionsnummernschema geändert - das wäre vielleicht ein geeigneter Zeitpunkt.



  • @camper

    also wäre es ratsam trotz dessen das es funktioniert die aktuelle Versionsnummer anzu geben!? also c++11!



  • freaksdd schrieb:

    @camper

    also wäre es ratsam trotz dessen das es funktioniert die aktuelle Versionsnummer anzu geben!? also c++11!

    Die Option als solche wird wahrscheinlich immer existieren (selbst wenn sie Standard werden sollte, so wie es -std=c++98 und -std=c++03 gibt), wenn das also die Sprachversion ist, mit der entwickelt wurde, macht es Sinn, diese stets anzugeben.



  • ich hab da jetzt auf c++11 eingestellt und so klappt es auch. Danke für eure Hilfe.


Anmelden zum Antworten