Hur kan jag bygga ett C++-projekt med flera beroende av varandra beroende underkataloger?

Hur kan jag bygga ett C++-projekt med flera beroende av varandra beroende underkataloger?

Eftersom katalogstrukturen i ditt projekt bara är till för att hålla dina filer organiserade, är ett tillvägagångssätt att ha en CMakeLists.txt som automatiskt hittar alla källfiler i src katalog och lägger också till alla kataloger som inkluderar kataloger som har en rubrikfil i dem. Följande CMake-fil kan fungera som utgångspunkt:

cmake_minimum_required(VERSION 3.0)

project (Foo)

file(GLOB_RECURSE Foo_SOURCES "src/*.cpp")
file(GLOB_RECURSE Foo_HEADERS "src/*.h")

set (Foo_INCLUDE_DIRS "")
foreach (_headerFile ${Foo_HEADERS})
    get_filename_component(_dir ${_headerFile} PATH)
    list (APPEND Foo_INCLUDE_DIRS ${_dir})
endforeach()
list(REMOVE_DUPLICATES Foo_INCLUDE_DIRS)

add_executable (FooExe ${Foo_SOURCES})
target_include_directories(FooExe PRIVATE ${Foo_INCLUDE_DIRS})

De två file(GLOB_RECURSE ... kommandon bestämmer uppsättningen av käll- och rubrikfiler. foreach loop beräknar uppsättningen av include-kataloger från listan över alla rubrikfiler.

En nackdel med att beräkna uppsättningen källfiler är att CMake inte automatiskt upptäcker när nya filer läggs till i ditt källträd. Du måste manuellt återskapa dina byggfiler då.


Jag är ingen expert på CMake men eftersom det inte finns några andra svar ska jag ta en titt på dokumentationen och prova. Att organisera källkod och inkludera filer i olika kataloger är i stort sett normen.

Det ser ut som att CMake låter dig ge en lista över inkluderande kataloger:http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:include_directories

Så något i stil med:

include_directories("src/top1/mid1/bot1" "src/top1/mid1/bot2/" ... )

Dessa skickas till kompilatorn så att den kan hitta rubrikfilerna och skickas för var och en av källfilerna. Så vilken som helst av dina källfiler bör kunna inkludera vilken som helst av rubrikfilerna (vilket jag tror är vad du efterfrågar).

På liknande sätt bör du kunna lista alla dina källfiler i kommandot add_executable:

add_executable(name "src/top1/mid1/bot1/src1.cpp" "src/top1/id1/bot2/src2.cpp" ...)

Så det här vore ett naivt sätt att få allt att byggas. Varje källfil kommer att kompileras och letar efter rubriker i alla dessa kataloger och sedan länkas objektfilerna samman. Fundera på om det finns något sätt att förenkla detta så att du inte behöver så många inkluderade mappar, kanske finns det bara ett fåtal vanliga rubrikfiler som behöver refereras av alla källfiler. Om saker och ting blir mer komplexa kan du bygga in underhierarkier i bibliotek etc. Överväg också att separera källfiler och rubriker (t.ex. i src och include).