CMake oder selber ein Script erstellen?



  • Hallo, ich Programmiere schon seit ein paar Monaten C++ und es werden so langsam ein paar Klassen und Header Nötig da ich nicht alles in eine Datei packen möchte. Wie oben schon erwähnt ist dies meine Frage. Was ist euer Meinung besser CMake oder selbst ein bash script schreiben das das Programm compiliert und in ein Build Ordner packt. Achso und es muss auch keine bestimmtes Betriebssystem sein ich brauch das nur auf Linux!

    Danke für die Hilfe!



  • Es gibt nur die beiden Alternativen?



  • Nein es gebt ja mehr das weiß ich aber was würdet ihr mir empfehlen?



  • Der Anfang mit CMake empfand ich damals als wiederlich.
    Aber jetzt hab ichs immer dabei in meinen Projekten, weil

    cmake ..
    make -jX

    Ist einfach quick & easy überall (Windows, Linux, Raspi).
    Potentielle Änderungen am Script könnten immer nerviger und aufwändiger werden, je nachdem wie aufwendig du das gestaltest.
    Je komplexer das Projekt (mehr libs, mehr files), desto angenehmer wird CMake.

    CMake setzt sich auch llaaannnggssaaamm bei IDEs durch.



  • Aber wen ihr andere Möglichkeiten wisst immer her dammit!



  • @5cript Ich habe ein Problem bei CMake nähmlich wen ich da Header habe dann meckert er Rum das da kein link oder so ist. Hast du da eine Idee?



  • Ich bekomme bei Cmake immer diesen Fehler raus:

    usr/bin/ld: /tmp/ccbkT6YI.o: in function `main':
    main.cpp:(.text+0x5): undefined reference to `func1()'
    collect2: Fehler: ld gab 1 als Ende-Status zurück
    

    main.cpp:

    #include "a.hpp"
    
    int main(){
           func1();
           return 0;
    }
    

    a.hpp :

    #pracma once
    void func1();
    

    a.cpp :

    #include <iostream>
    #include "a.hpp"
    
    void func1(){
       std::cout << "Test\n"
    }
    


  • Wie sieht die cmake file denn aus?
    Sieht aus als wär die a.cpp nicht im build drin

    Hier mal mein persönliche template angepasst für dein Beispiel:

    # Version check
    cmake_minimum_required (VERSION 3.8)
    
    if(NOT "${CMAKE_CXX_STANDARD}")
    	set(CMAKE_CXX_STANDARD 17)
    endif()
    set(CMAKE_CXX_EXTENSIONS OFF)
    
    if (NOT EXISTS ${CMAKE_BINARY_DIR}/CMakeCache.txt)
      if (NOT CMAKE_BUILD_TYPE)
        set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
      endif()
    endif()
    
    # Project
    project(Something)
    
    # Add executeable
    add_executable(${PROJECT_NAME}
        "main.cpp"
        "a.cpp"
    )
    
    # Compiler Options
    set(DEBUG_OPTIONS -fexceptions -g -Wall -pedantic-errors -pedantic)
    set(RELEASE_OPTIONS -fexceptions -O3 -Wall -pedantic-errors -pedantic)
    target_compile_options(${PROJECT_NAME}PUBLIC "$<$<CONFIG:DEBUG>:${DEBUG_OPTIONS}>")
    target_compile_options(${PROJECT_NAME}PUBLIC "$<$<CONFIG:RELEASE>:${RELEASE_OPTIONS}>")
    


  • @5cript Danke ! Ich wusste garnicht das man da in der CMakeList so viel angeben muss.
    Hast du vieleicht irgendwelche Links wo ich das lernen kann?



  • Das ganze lässt sich auf deutlich weniger reduzieren.
    Aber die Datei lässt sich abkürzen auf:

    • Setze C++17 als Standard, falls nicht in Commandline
    • Setze auf Release Build, falls nicht gesetzt
    • Deklarier ein Projekt
    • Zum Projekt gehört eine executable aus folgenden Dateien: [...]
    • Setze Compileroptionen für debug und release modus

    Hier ist eine "Liste"/Tutorial der wichtigsten Funktionen:
    (linken, sourcen hinzufügen, compiler optionen)
    https://cmake.org/cmake/help/latest/guide/tutorial/index.html

    Ich würde aber erstmal klein anfangen und dann schaun was du brauchst und das googlen. Das meiste kann man sich auch auf Stackoverflow erstmal zusammenpuzzeln.
    Bei Verzweiflung gibts ja noch das Forum und die CMake Webseite.

    Außerdem kannst du den Rat "nicht dateien mit GLOB hinzufügen" erstmal ignorieren. Das ist hauptsächlich relevant wenn man CMake nicht immer wieder ausführt und sich auf die inkrementellen Builds von make verlässt.

    Das säh dann so aus:

    # Sucht alle Dateien mit Endung .cpp rekursiv im Projektverzeichnis zusammen und fügt sie zu sources.
    file(GLOB_RECURSE sources "*.cpp")
    
    # Add executable
    add_executable(${PROJECT_NAME} ${sources})
    

Log in to reply