web-dev-qa-db-fra.com

Cmake include_directories ()

Ceci est mon arbre de projet:

project
| + src
| + external
| | + foo
| | | + include
| | | | - foo.hpp
| | | + src
| | | | - foo.cpp
| | | | - CMakeLists.txt
| | | - CMakeLists.txt 
| | + CMakeLists.txt 
| + src
| | - main.cpp
| - CMakeLists.txt

foo.cpp comprend foo.hpp:

// foo.cpp
#include "foo.hpp"

Maintenant, le problème est qu’inclure le répertoire dans la partie supérieure de CMake permet de trouver foo.hpp, .__ avec succès, mais si j’inclue dans le sous-projet, ce n’est pas le cas. Une raison pour ça? (les répertoires sont inclus avant que l'exécutable ne soit compilé).

// project/CMakeLists.txt
include_directories(external/foo/include) //OK
add_subdirectory(external)

add_executable(main main.cpp)
target_link_libraries(main foo)

// project/external/CMakeLists.txt
add_subdirectory(foo)

// project/external/foo/CMakeLists.txt 
include_directories(include) // NOT WORKING
add_subdirectory(src)

// project/external/foo/src/CMakeLists.txt 
add_library(foo foo.cpp)
16
memecs

Citation de la documentation pour include_directories :

Les répertoires d'inclusion sont ajoutés à la propriété de répertoire INCLUDE_DIRECTORIES pour le fichier CMakeLists actuel. Ils sont aussi ajouté à la propriété cible INCLUDE_DIRECTORIES pour chaque cible dans le fichier CMakeLists actuel. Les valeurs de propriété cible sont celles utilisé par les générateurs.

La propriété de répertoire INCLUDE_DIRECTORIES est héritée de tous les sous-répertoires et de toutes les cibles du répertoire.

  • Spécifier ${CMAKE_CURRENT_SOURCE_DIR} pour include_directories est redondant car les chemins relatifs sont interprétés comme relatifs à ce répertoire par défaut. Vous devriez le jeter pour augmenter la lisibilité.
  • Spécifier un répertoire d'inclusion dans un sous-répertoire et son parent est redondant. Vous devriez éviter cela et vous installer sur un seul site.
  • Utilisez get_property et message pour vérifier que tous les répertoires et toutes les cibles se retrouvent avec les entrées correctes dans leur propriété INCLUDE_DIRECTORIES.
  • Si vous êtes libre d'exiger au minimum CMake 2.8.11, pensez à abandonner complètement include_directories et utilisez target_include_directories à la place. Cela a pour avantage que les dépendances sont résolues exclusivement sur chaque cible, ce qui est généralement le comportement le plus souhaitable.
27
ComicSansMS

C'est peut-être un problème de portée. Je pense que ce que vous essayez de faire ici est de propager le paramètre du /project/external/foo/CMakeLists au /project/CMakeLists et de sorte que ce paramètre puisse être propagé au /project/src/CMakeLists. Mais malheureusement, la propagation de CMakeLists de niveau inférieur à supérieur n'est pas possible dans cmake, sauf pour les valeurs mises en cache. Cela signifie que vous aurez également besoin d'ajouter include_directories (${CMAKE_SOURCE_DIR}/external/foo/include) dans le /project/src/CMakeLists.txt. Ou, comme vous l'avez déjà fait, vous pouvez simplement ajouter cette ligne dans les listes CMakeLists de niveau supérieur.

0
summer.icecream