2014-09-09 22 views
5

Podczas gdy łatwo jest znaleźć informacje na temat poziomu powierzchni na temat używania CMake, informacja, jak właściwie używać CMake wydaje się być bardzo trudna do znalezienia. Jak w przypadku przyzwoitego projektu CMake (jeden plik wykonywalny, jedna lub więcej statycznych bibliotek używanych przez ten plik wykonywalny, jedna lub więcej zewnętrznych zależności używanych przez biblioteki statyczne) należy zamówić foldery i pliki CMakeList.txt? Jakie pliki CMakeList.txt powinny mieć jakie polecenia?Jak poprawnie skonfigurować projekt CMake?

+1

Czy znasz Wiki http://www.cmake.org/Wiki/CMake na cmake teren? –

+0

@SergeiNikulov Cytat: 'Jesteś teraz na wiki CMake. Wiele stron jest teraz ZASTRZEŻONYCH, a czasami nawet uważanych za złe praktyki. Są one przechowywane tylko jako odniesienie dla poprzednich wersji CMake. " – Zingam

Odpowiedz

3

dobrym sposobem, aby dowiedzieć się, jak używać CMake skutecznie to patrząc na innych projektach. LLVM i jego podprojekty są dobrym przykładem.

Ogólnie dobre praktyki kodowania zamieniają się w dobre praktyki CMake; chcesz modułowość, jasny styl i elastyczność.

Przykładem może być posiadanie reguł do budowania pliku wykonywalnego w katalogu src, a następnie użycie tego celu w głównym folderze projektu. Coś takiego:

-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

Czy możesz podać bardzo prosty przykład na temat tych plików CMakeLists.txt? –

+0

@ruslo, punkt odniesienia, ale są one dość dobrze skomentowane i pokazują użycie szerokiej gamy funkcji, co jest więcej niż mogę powiedzieć dla wielu innych przykładów. Dodatkowo CMakeLists stają się prostsze, gdy schodzisz do struktury katalogów; Mam nadzieję, że każdy może zrozumieć pliki do budowy wewnętrznych bibliotek statycznych, na przykład. – TartanLlama

1

Mam nadzieję, że this tutorial jest dokładnie tym, czego potrzebujesz od konfiguracji CMake do prostego projektu zawierającego jeden plik wykonywalny i kilka bibliotek - zobacz! Znajdę CUpewnij przykładem każdym razie najlepszą możliwość, aby dowiedzieć się CWprowadä łatwy sposób:

Korzystanie CMake z wykonywalnych

add_executable(myapp main.c) 

Korzystanie CMake z bibliotek statycznych

add_library(test STATIC test.c) 

Używanie CMake z bibliotekami dynamicznymi

add_library(test SHARED test.c) 

Łączenie bibliotek do plików wykonywalnych z CMake

add_subdirectory(libtest_project) 

add_executable(myapp main.c) 

target_link_libraries(myapp test) 
+1

Jeśli jesteś zainteresowany, możesz nieco ulepszyć ten samouczek, użyj: [cmake -H. -B_builds] (http://stackoverflow.com/a/20611964/2288008) do zbudowania projektu (zamiast 'mkdir _builds && cd _builds && cmake ..'). 'make' i' make install' będą działać tylko dla makefile, możesz użyć 'cmake --build _builds' i' cmake --build _builds --target install' dla dowolnego rodzaju generatorów. Również wtedy, gdy używasz 'ExternalProject_Add', nie możesz używać modułów' find_package'. –

Powiązane problemy