2017-06-30 3 views
2

Ich habe ein Projekt main_project. Es hängt von zwei Bibliotheken ab - libA und libB, die wiederum von lib_common abhängen.Mehrere Unterprojekte, die von derselben Bibliothek abhängen

Grafisch Projektstruktur sieht wie folgt aus:

main_project 
    | 
    +-libA 
    | | 
    | +-CMakeLists.txt 
    | 
    +-libB 
    | | 
    | +-CMakeLists.txt 
    | 
    +-lib_common 
    | | 
    | +-CMakeLists.txt 
    | 
    +-CMakeLists.txt 

Seit libAlib_common verwendet es ziemlich natürlich ist add_subdirectory(lib_common) innerhalb libA ‚s zu nennen CMakeLists.txt. Aber die libB hängt auch von lib_common ab. Wenn ich es wieder in ein Unterverzeichnis lege, wird es zweimal kompiliert. Und das will ich nicht. Außerdem möchte ich alle meine Unterprojekte sauber und in sich geschlossen halten - deshalb möchte ich lib_common in die oberste Ebene main_project nicht setzen (weil lib_common nichts mit main_project haben).

Welche Optionen habe ich?

+0

Abhängigkeiten werden mit 'add_dependency' oder' target_link_libraries' hinzugefügt. Kein Aufruf von 'add_subdirectory' aus dem Blatt CMakeLists.txt – arrowd

Antwort

0

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.

0

ich denke, das eine ziemlich Standard CMake Lösung:

# toplevel CMakeLists.txt 
add_subdirectory(libA) 
add_subdirectory(libB) 
add_subdirectory(lib_common) 

# libA CmakeLists.txt 
add_library(libA ${LIBA_SOURCES}) 
target_link_libraries(libA lib_common) 

und ähnliche für libB.

Sie müssen nicht add_subdirectory(lib_common) vor aufrufen, CMake behandelt das Abhängigkeitsmanagement automatisch.

Verwandte Themen