Ja, Sie haben zwei Möglichkeiten. Nehmen wir an, Sie haben die Ordnerstruktur etwas Ähnliches.
├── autopilot
│ ├── _AutoPilot.cpp
│ ├── _AutoPilot.h
│ └── action
│ ├── ActionBase.cpp
│ ├── ActionBase.h
│ ├── APcopter
│ │ ├── APcopter_avoid.cpp
│ │ ├── APcopter_avoid.h
Wenn Sie AUX_SOURCE_DIRECTORY
verwenden Sie haben CMakeLists.txt jeden von Unterverzeichnisse hinzuzufügen. Dann müssen Sie alle diese Unterverzeichnisse einschließen und verknüpfen. Das ist eine ziemlich schwierige Aufgabe. So können Sie GLOB und die Arbeit sehr leicht machen. So wird es gemacht.
file(GLOB autopilot_sources ./*.cpp ./*/*.cpp ./*/*/*.cpp ./*/*/*/*.cpp ./*.c ./*/*.c ./*/*/*.c ./*/*/*/*.c)
SET(autopilot ${autopilot_sources})
Wenn Sie eine Bibliothek mit über Quellcode erstellen möchten, ist dies der Befehl:
ADD_LIBRARY (autopilot ${autopilot})
TARGET_LINK_LIBRARIES (autopilot)
Wenn Sie eine ausführbare Datei mit über Quellcode dieser erstellen möchten ist der Befehl:
ADD_EXECUTABLE(autopilot ${autopilot})
Beachten Sie, dass "alle Quelldateien mit glob sammeln" in CMake ** nicht empfohlen wird: * Wir empfehlen nicht, 'GLOB' zu verwenden, um eine Liste von Quelldateien aus Ihrer Quellstruktur zu sammeln. Wenn sich keine 'CMakeLists.txt'-Datei ändert, wenn eine Quelle hinzugefügt oder entfernt wird, kann das generierte Build-System nicht wissen, wann CMake aufgefordert werden soll, neu zu generieren. * - from [documentation] (https://cmake.org/cmake/help/ v3.7/command/file.html) –
@FranklinYu gibt es eine Alternative, bei der nicht jeder Dateiname manuell geschrieben werden muss? –
@Ciro Wenn Sie vermeiden möchten, jeden Dateinamen zu schreiben, dann denke ich "foreach" von OP genannt ist der Weg zu gehen. Das CMake-Team scheint jedoch zu empfehlen, * jeden Dateinamen * manuell zu schreiben. –