2011-12-12 15 views
12

Tenemos un proyecto P (C/C++ en Linux) que consiste en bibliotecas lib1, lib2, lib3.Biblioteca múltiple CMakeLists.txt

  • lib1 es independiente vinculado a otro librerías de todo el sistema
  • lib2 enlaces a lib1
  • lib3 enlaces tanto a lib1 y lib2

Tenemos un directorio P y directorios adicionales para cada uno de nuestras libs (así, P/lib1/, P/lib2/ ...). Cada biblioteca también tiene sus propias pruebas.

Preguntas:

  • Por favor, cómo organizar CMakeLists.txt para este escenario?
  • ¿Deberíamos crear solo un directorio maestro build o uno para cada lib?
  • ¿Podemos tener una opción en CMakeLists.txt para STATIC vs. SHARED vincular?

Respuesta

22

En este caso, recomendaría el uso de un solo compilación/directorio. CMake probablemente genere directorios lib1, lib2 y lib3 separados allí.

El cambio entre ESTÁTICO vs COMPARTIDO se puede hacer mediante el uso de la bandera BUILD_SHARED_LIBS (consulte la documentación add_library)

Con respecto a la organización CMakeLists.txt, la elección es suya:

  1. Usted puede construir un solo CMakeLists.txt que tiene múltiples entradas add_library. Esto tiene la ventaja de que obtendrá un solo CMakeLists.txt, que algunas personas pueden preferir cuando los proyectos son simples.

  2. Puede dividir su proyecto en múltiples CMakeLists.txt distribuidas en sus directorios lib1, lib2 y lib3 y utilizar una raíz cmakelists.txt con add_subdirectory. El beneficio de esta configuración es que será más fácil generar los archivos de compilación con una sola llamada (en su compilación/directorio), pero podría pasar fácilmente a, p. Ej. lib3/y llama a make/msbuild allí. CMake se asegurará de que las dependencias se construyen correctamente

Ejemplo 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 

Ejemplo 2:

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

En cada subdirectorio, a continuación, escribe su CMakeLists.txt. P.ej. en caso de 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

Genial, gracias. – Cartesius00

Cuestiones relacionadas