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)
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.
${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é.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
.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.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.