2011-02-05 24 views
24

que estoy tratando de utilizar CMake para establecer algunas dependencias simples entre un proyecto de C++ y las bibliotecas que utiliza.CMake cómo crear correctamente las dependencias entre los objetivos

La puesta en marcha es el siguiente

  • Proyecto
    • Dependencia

Proyecto en sí contiene archivos de origen que incluyen las cabeceras de Dependencia y cuando el ejecutable se genera necesita estar vinculado a la biblioteca estática de Dependency.

Hasta ahora puedo hacer que esto funcione pero tengo que especificar los directorios de inclusión de Dependencia en el archivo CMakeLists para Proyecto manualmente. Quiero que esto se elimine automáticamente y he explorado la opción de usar el comando find_package() para hacerlo con un éxito limitado y hacer las cosas mucho más complicadas.

Todo lo que quiero hacer es tener Dependencia construida antes del Proyecto y tener el enlace Proyecto contra la biblioteca y tener sus directorios de inclusión. ¿Hay una forma simple y concisa de lograr esto?

Mis archivos actuales de cmake:

PROYECTO, CMakeLists.txt:

cmake_minimum_required (VERSION 2.6) 
project (Project) 
include_directories ("${PROJECT_SOURCE_DIR}/Project") 
add_subdirectory (Dependency) 
add_executable (Project main.cpp) 
target_link_libraries (Project Dependency) 
add_dependencies(Project Dependency) 

dependencia, CMakeLists.txt

project(Dependency) 
add_library(Dependency SomethingToCompile.cpp) 
target_link_libraries(Dependency) 
+0

Pedido: http://stackoverflow.com/questions/10004134/cmake-add-dependency-not-in-subdirectory –

Respuesta

1

No se sabe exactamente lo que quiere hacer, y por qué Project y Depency deben construirse por separado.

Mi primera, aunque en su ejemplo sería

  1. en el proyecto, CMakeLists.txt

    • Retire add_dependencies (Proyecto de Dependencia) No hay necesidad de especificar la dependencia, target_link_libraries() ya hace eso.
  2. En dependencia, CMakeLists.txt

    • Quitar proyecto (Dependencia) crea una biblioteca, así que por qué tener un proyecto propio?
    • target_link_libraries remove (dependencia) porque no hace nada
+6

Para responder a su pregunta . La dependencia puede ser un proyecto para una biblioteca compartida que se incluye como submódulo de git. La biblioteca compartida está diseñada para funcionar también sin el proyecto externo. – Arne

16

Desde CMake 2.8.11 puede utilizar target_include_directories. Simplemente agregue en su proyecto DEPENDENCIA esta función y complete los directorios que desea ver en el proyecto principal. A CMake le importará el resto.

PROYECTO, CMakeLists.txt:

cmake_minimum_required (VERSION 2.8.11) 
project (Project) 
include_directories (Project) 
add_subdirectory (Dependency) 
add_executable (Project main.cpp) 
target_link_libraries (Project Dependency) 

dependencia, CMakeLists.txt

project (Dependency) 
add_library (Dependency SomethingToCompile.cpp) 
target_include_directories (Dependency PUBLIC include) 
Cuestiones relacionadas