2014-09-09 13 views
5

Während es leicht ist, Informationen über die Oberfläche zu finden, wie man CMake benutzt, scheint es sehr schwierig zu finden, wie man CMake korrekt benutzt. Wie sollten in einem CMake-Projekt von anständiger Größe (eine ausführbare Datei, eine oder mehrere statische Bibliotheken, die von dieser ausführbaren Datei verwendet werden, eine oder mehrere externe Abhängigkeiten, die von den statischen Bibliotheken verwendet werden) die Ordner und CMakeList.txt-Dateien bestellt werden? Welche CMakeList.txt-Dateien sollten welche Befehle haben?Wie richte ich ein CMake-Projekt korrekt ein?

+1

Haben Sie das Wiki http://www.cmake.org/Wiki/CMake auf cmake gelesen Seite? ˅? –

+0

@SergeiNikulov Zitat: 'Sie sind jetzt auf dem CMake Wiki. Viele Seiten sind jetzt veraltet und manchmal sogar als schlechte Praxis angesehen. Diese werden nur als Referenz für frühere CMake-Versionen beibehalten. – Zingam

Antwort

3

Eine gute Möglichkeit, zu lernen, wie CMake effektiv zu nutzen, ist in anderen Projekten suchen. LLVM und seine Teilprojekte sind ein gutes Beispiel.

Im Allgemeinen konvertieren gute Codierpraktiken in gute CMake-Praktiken. Sie wollen Modularität, einen klaren Stil und Flexibilität.

Ein Beispiel hierfür könnte sein, Regeln für die Erstellung Ihrer ausführbaren Datei im Verzeichnis src zu haben, und dieses Ziel dann im Stammprojektordner zu verwenden. Etwas wie folgt aus:

-my_proj 
| 
----CMakeLists.txt //contains directives for top-level dependencies and linking, includes subfolders 
----src 
    | 
    ----CMakeLists.txt //contains definition of your main executable target 
    ----internal_lib 
     | 
     ----CMakeLists.txt //contains definition of your internal static libraries 

my_proj/CMakeLists.txt

add_subdirectory(src) 
find_package (Threads REQUIRED) #find pthreads package 
target_link_libraries (my_exe my_lib ${CMAKE_THREAD_LIBS_INIT}) #link against pthreads and my_lib 

my_proj/src/CMakeLists.txt

add_subdirectory(internal_lib) 
add_executable(my_exe my_source1.cpp mysource2.cpp) 

my_proj/src/internal_lib/CMakeLists.txt

add_library(my_lib my_lib_source1.cpp my_lib_source2.cpp) 
+0

Könnten Sie ein sehr einfaches Beispiel dafür angeben, wie diese CMakeLists.txt-Dateien aussehen würden? –

+0

@ruslo, ein fairer Punkt, aber sie sind ziemlich gut kommentiert und zeigen die Verwendung einer breiten Palette von Funktionen, die mehr als ich für viele andere Beispiele sagen könnte. Zusätzlich werden die CMakeLists einfacher, wenn Sie die Verzeichnisstruktur absenken; Ich würde hoffen, dass jeder die Dateien zum Erstellen interner statischer Bibliotheken verstehen könnte. – TartanLlama

1

Ich hoffe, this tutorial ist genau das, was Sie brauchen, um mit einer CMake-Konfiguration für ein einfaches Projekt zu beginnen, das eine ausführbare Datei und mehrere Bibliotheken enthält - werfen Sie einen Blick darauf! Ich finde die CMake von Beispiel ohnehin die beste Möglichkeit CMake die einfache Möglichkeit, zu lernen:

mittels CMake mit ausführbaren Dateien

add_executable(myapp main.c) 

mittels CMake mit statischen Bibliotheken

add_library(test STATIC test.c) 

Verwendung von CMake mit dynamischen Bibliotheken

add_library(test SHARED test.c) 

Einbinden von Bibliotheken mit CMake ausführbaren

add_subdirectory(libtest_project) 

add_executable(myapp main.c) 

target_link_libraries(myapp test) 
+1

Wenn Sie interessiert sind, können Sie dieses Tutorial ein wenig verbessern, verwenden Sie: [cmake -H. -B_builds] (http://StackOverflow.com/a/20611964/2288008), um ein Projekt zu erstellen (anstelle von 'mkdir _builds && cd _builds && cmake ..'). 'make' und' make install' funktionieren nur für Makefile, Sie können 'cmake --build _builds' und' cmake --build _builds --target install' für jede Art von Generatoren verwenden. Auch wenn Sie 'ExternalProject_Add' verwenden, können Sie' find_package' Module nicht verwenden. –

Verwandte Themen