2011-12-12 8 views
12

Abbiamo un progetto P (C/C++ su Linux) composto da librerie lib1, lib2, lib3.Libreria multipla CMakeLists.txt

  • lib1 è autonomo collegato ad un altro librerie a livello di sistema
  • lib2 collegamenti per lib1
  • lib3 collegamenti sia lib1 e lib2

Abbiamo una directory P e le directory in più per ciascuno dei le nostre librerie (quindi, P/lib1/, P/lib2/ ...). Ogni biblioteca ha anche i suoi test.

Domande:

  • prega, come organizzare CMakeLists.txt per questo scenario?
  • Dovremmo creare solo una directory master build o una per ogni lib?
  • Possiamo avere un'opzione in CMakeLists.txt per il collegamento STATIC vs. SHARED?

risposta

22

In questo caso, si consiglia di utilizzare una singola build/directory. CMake probabilmente genererà directory lib1, lib2 e lib3 separate lì.

La commutazione tra STATICO vs. condivisa può essere fatto utilizzando il flag BUILD_SHARED_LIBS (controllare la documentazione add_library)

Per quanto riguarda l'organizzazione CMakeLists.txt, la scelta è vostra:

  1. È puoi creare un singolo CMakeLists.txt che ha più voci add_library. Questo ha il vantaggio di ottenere un singolo CMakeLists.txt, che alcune persone potrebbero preferire quando i progetti sono semplici.

  2. È possibile suddividere il progetto in più CMakeList.txt distribuiti sulle directory lib1, lib2 e lib3 e utilizzare un root cmakelists.txt con add_subdirectory. Il vantaggio di questa configurazione è che sarà più facile generare i file di build con una sola chiamata (nella tua build/directory), ma potresti facilmente passare ad es. lib3/e call make/msbuild lì. CMake farà in modo che le dipendenze sono costruite correttamente

Esempio 1:

project(P) 
# Setup lib1 
set (LIB1_SOURCES ...) # Fill in your set of source-files here... 
add_library(lib1 ${LIB1_SOURCES}) 
# Do similar for lib2 and lib3 
target_link_libraries(lib2 lib1) # Indicate that lib1 is needed for lib2 
target_link_libraries(lib3 lib1 lib2) # Indicate that lib2 and lib1 are needed for lib3 

Esempio 2:

project(P) 
add_subdirectory(lib1) 
add_subdirectory(lib2) 
add_subdirectory(lib3) 

In ogni sottodirectory poi scrivere il CMakeLists.txt. Per esempio. in caso di lib3:

project(lib3) 
set(LIB3_SOURCES ...) # Setup the list of sources here. 
add_library(lib3 ${LIB3_SOURCES}) 
# You can refer to other libraries which should be available from the root cmakelists. 
target_link_libraries(lib3 lib1 lib2) 
+0

Grande, grazie. – Cartesius00