Bonjour,

Je me suis replongé dans C++ récemment. Afin d'améliorer mes projets, j'ai commencé à apprendre CMake. Mon objectif du jour est de parvenir à construire un anciens projet à l'aide de l'outil CMake. Le projet en question est un simple jeu de rôle tiré d'une formation openclassroom.

Pour la structure de mon projet, j'ai opté pour les chemins suivants :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
--jdr : main.cpp
    --extensions
        --headers : *.hpp
 
        --sources : *.cpp
Le problème que je rencontre est de bien lier les chemins au niveau de CMake. Pour le moment, j'utilise un fichier CMake à chaque étape du chemin et je construis le projet dans un autre dossier dédié \jdr\build\, c'est-à-dire :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
--jdr : main.cpp CMakeLists.txt
    --build
    --extensions : CMakeLists.txt
        --headers : *.hpp
 
        --sources : *.cpp CMakeLists.txt
L'erreur que je rencontre se situe au niveau de main.cpp :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
arme.cpp
Arme.vcxproj -> ...\jdr\build\extensions\sources\Debug\Arme.lib
main.cpp
...\jdr\main.cpp(1,10): fatal error C1083: Impossible d'ouvrir le fichier include : 'arme.hpp' : No such file or directory [...\jdr\build\JDR.vcxproj]
personnage.cpp
Personnage.vcxproj -> ...\jdr\build\extensions\sources\Debug\Personnage.lib
mage.cpp
Mage.vcxproj -> ...\jdr\build\extensions\sources\Debug\Mage.lib
J'ai essayé deux ou trois trucs un peu à l'aveuglette et consulté quelques pages stackoverflow mais je dois admettre ne pas comprendre les solutions proposées ou ne pas bien les appliquer à mon projet.

Afin de vous fournir toutes les clefs nécessaire pour m'aider, je vous mets le contenu des différences fichiers CMake. D'abord le fichier se trouvant ...\jdr\ :
Code cmake : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#   CMake version requirements
cmake_minimum_required(VERSION 3.10)
 
#   Project name
project(JDR VERSION 0.1)
 
#   C++ version
add_library(cpp_std INTERFACE)
target_compile_features(cpp_std INTERFACE cxx_std_17)
 
#   Subdirectories
add_subdirectory(extensions)
 
#   Executable
add_executable(JDR main.cpp)
 
#   Links C++ version to project
target_link_libraries(JDR PUBLIC extensions cpp_std)
 
#   Links binary dir to project
target_include_directories(JDR PUBLIC "${PROJECT_BINARY_DIR}")

Ensuite, celui présent dans ...\jdr\extensions\ :
Code cmake : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
#   Add subdirectories to project
include_directories(headers)
add_subdirectory(sources)

Enfin, celui présent dans ...\jdr\extensions\sources\ :
Code cmake : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
#   Add libraries
add_library(Arme arme.cpp)
add_library(Mage mage.cpp)
add_library(Personnage personnage.cpp)
 
#   Link libraries
target_link_libraries(Mage PRIVATE Arme Personnage)
target_link_libraries(Personnage PRIVATE Arme)
target_link_libraries(Arme PUBLIC cpp_std)
target_link_libraries(Mage PUBLIC cpp_std)
target_link_libraries(Personnage PUBLIC cpp_std)

Etant donné que je débute avec CMake et que mon niveau en C++ n'est pas beaucoup plus élevé, tout commentaire digressif portant sur les bonnes pratiques ou autre sont également les bienvenus.

Si vous avez besoin d'informations supplémentaires comme le contenu des fichiers sources et headers, faites le moi savoir