web-dev-qa-db-fra.com

Comment créer correctement des dépendances entre les cibles dans CMake?

J'essaie d'utiliser CMake pour configurer quelques dépendances simples entre un projet C++ et les bibliothèques qu'il utilise.

La mise en place est la suivante

  • Projet
    • Dépendance

Le projet lui-même contient des fichiers source qui incluent des en-têtes de Dependency. Lorsque l'exécutable est créé, il doit être lié à la bibliothèque statique de Dependency.

Jusqu'ici, je peux obtenir que cela fonctionne, mais je dois spécifier manuellement les répertoires include de Dependency dans le fichier CMakeLists.txt pour Project. Je veux que cela soit retiré automatiquement et j'ai exploré la possibilité d'utiliser la commande find_package() pour le faire avec un succès limité et en rendant les choses beaucoup plus compliquées.

Tout ce que je veux faire, c'est que Dependency soit construit avant Project et que Project soit lié à la bibliothèque et que ses répertoires include soient inclus. Existe-t-il un moyen simple et concis d’atteindre cet objectif?

Mes fichiers CMake actuels:

Project, fichier 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)

Dependency, fichier CMakeLists.txt:

project(Dependency)
add_library(Dependency SomethingToCompile.cpp)
target_link_libraries(Dependency)
30
radman

Depuis CMake 2.8.11, vous pouvez utiliser target_include_directories. Ajoutez simplement cette fonction à votre projet DEPENDENCY et complétez les répertoires d’inclusion que vous voulez voir dans le projet principal. CMake s'occupera du reste.

PROJECT, 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)

DEPENDENCY, CMakeLists.txt

project (Dependency)
add_library (Dependency SomethingToCompile.cpp)
target_include_directories (Dependency PUBLIC include)
21
dipp

Vous ne savez pas exactement ce que vous voulez faire ni pourquoi Project et Depency doivent être construits séparément.

Mon premier si sur votre exemple serait

  1. Dans PROJECT, CMakeLists.txt

    • Supprimez add_dependencies (Project Dependency) Il n'est pas nécessaire de spécifier une dépendance, target_link_libraries () le fait déjà.
  2. Dans DEPENDENCY, CMakeLists.txt

    • Supprimer le projet (dépendance) Il construit une bibliothèque, alors pourquoi avoir son propre projet?
    • Supprimer target_link_libraries (Dependency) Parce que cela ne fait rien
0
Vladislav Vaintroub