Sì, avete due opzioni. Supponiamo che la struttura della cartella sia simile a questa.
├── autopilot
│ ├── _AutoPilot.cpp
│ ├── _AutoPilot.h
│ └── action
│ ├── ActionBase.cpp
│ ├── ActionBase.h
│ ├── APcopter
│ │ ├── APcopter_avoid.cpp
│ │ ├── APcopter_avoid.h
Se si sta per utilizzare AUX_SOURCE_DIRECTORY
è necessario aggiungere CMakeLists.txt ognuno di sottodirectory. Quindi devi includere e collegare tutte quelle sottodirectory. Questo è un compito abbastanza difficile. Quindi puoi GLOB e fare il lavoro molto facilmente. Questo è come è fatto.
file(GLOB autopilot_sources ./*.cpp ./*/*.cpp ./*/*/*.cpp ./*/*/*/*.cpp ./*.c ./*/*.c ./*/*/*.c ./*/*/*/*.c)
SET(autopilot ${autopilot_sources})
Se si desidera creare una libreria utilizzando sopra il codice sorgente di questo è il comando:
ADD_LIBRARY (autopilot ${autopilot})
TARGET_LINK_LIBRARIES (autopilot)
Se si desidera creare un file eseguibile utilizzando sopra il codice sorgente di questo è il comando:
ADD_EXECUTABLE(autopilot ${autopilot})
Nota che "raccogliere tutti i file di origine con glob" è ** non consigliato ** in CMake: * Non è consigliabile utilizzare 'GLOB' per raccogliere un elenco di file di origine dall'albero dei sorgenti. Se nessun file 'CMakeLists.txt' cambia quando una sorgente viene aggiunta o rimossa, il sistema di generazione generato non può sapere quando chiedere a CMake di rigenerare. * - da [documentazione] (https://cmake.org/cmake/help/ v3.7/command/file.html) –
@FranklinYu esiste un'alternativa che non richieda la scrittura manuale di ogni nome di file? –
@Ciro Se vuoi evitare di scrivere ogni nome di file, allora penso che "foreach" menzionato da OP sia la strada da percorrere. Tuttavia, il team di CMake sembra raccomandare * di scrivere manualmente ogni nome di file *. –