würde ich eine weitere Abstraktionsebene zu Ihrer Projektstruktur hinzufügen:
app
- das ist für ausführbare Dateien und für alles, was sie gehört,
lib
- Bibliotheken für die Anwendung.
Das Top-Level CMakeLists.txt
wissen nur, dass es zwei andere Sache ist, das app
Teilprojekt und das lib
Teilprojekt.Ein Beispiel Verzeichnisstruktur aussehen könnte wie folgt:
FooProject
|-- app
| |-- CMakeLists.txt
| `-- src
| `-- foo.cpp
|-- CMakeLists.txt
`-- lib
|-- CMakeLists.txt
|-- libA
| |-- CMakeLists.txt
| |-- inc
| | `-- bar.h
| `-- src
| `-- bar.cpp
|-- libB
| |-- CMakeLists.txt
| |-- inc
| | `-- baz.h
| `-- src
| `-- baz.cpp
`-- lib_common
|-- CMakeLists.txt
|-- inc
| `-- common_tool.h
`-- src
`-- common_tool.cpp
Die Top-Level-CMakeLists.txt
enthält nur die folgenden:
cmake_minimum_required(VERSION 2.8)
project(FooProject)
add_subdirectory(lib)
add_subdirectory(app)
Die app/CMakeLists.txt
sollte wissen, dass es einen lib
Ordner aus, wo Sie Header enthalten können und dass die ausführbare Datei ist abhängig von den libA
und die libB
:
project(foo)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../lib)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src FOO_SOURCES)
add_executable(foo ${FOO_SOURCES})
add_dependencies(foo libA libB)
target_link_libraries(foo libA libB)
install(TARGETS foo RUNTIME DESTINATION bin ARCHIVE DESTINATION bin)
Die lib/CMakeLists.txt
existiert zusammen die libA
, libB
und lib_common
zu binden:
cmake_minimum_required(VERSION 2.8)
add_subdirectory(lib_common)
add_subdirectory(libA)
add_subdirectory(libB)
Lassen Sie uns sagen, dass lib_common
keine Abhängigkeiten hat, so dass die lib/lib_common/CMakeLists.txt
nicht außerhalb seines Ordner sehen:
project(lib_common)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src LIBCOMMON_SOURCES)
add_library(lib_common ${LIBCOMMON_SOURCES})
In dieser Beispiel die lib/libA/CMakeLists.txt
und lib/libB/CMakeLists.txt
haben fast identischen Inhalt und nur sie befassen sich mit der lib_common
:
project(libA)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc ${CMAKE_CURRENT_SOURCE_DIR}/..)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src LIBA_SOURCES)
add_library(libA ${LIBA_SOURCES})
add_dependencies(libA lib_common)
target_link_libraries(libA lib_common)
install(TARGETS libA LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
In diesem Beispiel ist das lib
Unterprojekt als sauber und in sich abgeschlossen bezeichnet.
Abhängigkeiten werden mit 'add_dependency' oder' target_link_libraries' hinzugefügt. Kein Aufruf von 'add_subdirectory' aus dem Blatt CMakeLists.txt – arrowd