Bonjour à tous,
Ceci est mon premier post. Il est un peu long, mais précis.
J'espère ne pas me tromper de sous-forum, désolé par avance.
Dans le cadre d'un projet perso, je cherche à configurer un projet OpenGL qui utilise les librairies GLFW, GLEW et GLM, le tout en C++.
J'utilise l'IDE JetBrains CLion et donc cmake pour builder le projet.
J'avais commencé à suivre un tuto pour configurer tout ça : "https://www.youtube.com/watch?v=3OB3j330SMc&t=15m11s" (la première partie est sur Visual Studio).
Voilà le soucis, comme précisé dans le titre je suis sur Linux. J'essaie donc d'adapter la configuration à mon OS puisque le tuto était sur Windows. Et ça bloque au niveau du linkage de glew et glfw.
Pour reprendre au début, j'ai buildé les librairies proprement sur Linux en release avec CLion. Je me retrouve avec les librairies statiques "libglfw3.a" et "libGLEW.a".
Mon projet est structuré comme suit (à partir de la racine nommée "gameEngine") :
J'ai donc copié les librairies dans "Lib", et mis les headers nécessaires de chaque libraire dans "Includes/G...".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 + Bin + Lib -- libGLEW.a -- libglfw3.a + Includes -- + Glfw -- + Glew -- + Glm + game_engine_1 -- + Headers -- + Sources -- -- CMakeLists.txt -- -- Main.cpp CMakeLists.txt
Ensuite, voici le "CMakeLists.txt" situé à la racine :
Suivi de "./game_engine_1/Sources/CMakeLists.txt" :
Code CMakeLists : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CMAKE_MINIMUM_REQUIRED(VERSION 3.10) PROJECT(gameEngine) SET(CMAKE_CXX_STANDARD 14) SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/Bin) LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/Lib) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/Includes) ADD_SUBDIRECTORY(game_engine_1/Sources)
Pour finir j'ai un petit Main pour tester que ça compile et ça fonctionne :
Code CMakeLists : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/game_engine_1/Headers) FILE(GLOB_RECURSE ENGINE_SOURCES *.cpp *.c) FILE(GLOB_RECURSE ENGINE_HEADERS *.hpp *.h *.inl) ADD_EXECUTABLE(game_engine_1 ${ENGINE_SOURCES} ${ENGINE_HEADERS}) ADD_LIBRARY(glfw3 STATIC Main.cpp) #J'ai rajouté ces 2 lignes par rapport au tuto ADD_LIBRARY(GLEW STATIC Main.cpp) TARGET_LINK_LIBRARIES(game_engine_1 glfw3 GLEW) #Là j'ai modifié glew32 pour GLEW puisque je suis sur Linux
Et donc j'ai essayé plein de choses différentes avec le 2e CMake, je vous ai montré la version qui produit les résultats les plus cohérents, que voici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #include "Glew/glew.h" #include "Glfw/glfw3.h" int Main(int args, char** argv) { glfwInit(); glewInit(); return 0; }
J'ai suivi la rurique "Linking Libraries" à ce lien : "https://www.jetbrains.com/help/clion/quick-cmake-tutorial.html".
Code : 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
22
23
24
25
26 cmake --build /home/tc/game-engine/gameEngine/cmake-build-debug --target game_engine_1 -- -j 3 Scanning dependencies of target GLEW Scanning dependencies of target glfw3 [ 16%] Building CXX object game_engine_1/Sources/CMakeFiles/GLEW.dir/Main.cpp.o [ 33%] Building CXX object game_engine_1/Sources/CMakeFiles/glfw3.dir/Main.cpp.o [ 50%] Linking CXX static library libGLEW.a [ 66%] Linking CXX static library libglfw3.a [ 66%] Built target GLEW [ 66%] Built target glfw3 Scanning dependencies of target game_engine_1 [ 83%] Building CXX object game_engine_1/Sources/CMakeFiles/game_engine_1.dir/Main.cpp.o [100%] Linking CXX executable ../../../Bin/game_engine_1 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o : Dans la fonction « _start » : (.text+0x20) : référence indéfinie vers « main » CMakeFiles/game_engine_1.dir/Main.cpp.o : Dans la fonction « Main(int, char**) » : /home/tc/game-engine/gameEngine/game_engine_1/Sources/Main.cpp:6 : référence indéfinie vers « glfwInit » /home/tc/game-engine/gameEngine/game_engine_1/Sources/Main.cpp:7 : référence indéfinie vers « glewInit » collect2: error: ld returned 1 exit status game_engine_1/Sources/CMakeFiles/game_engine_1.dir/build.make:105: recipe for target '../Bin/game_engine_1' failed make[3]: *** [../Bin/game_engine_1] Error 1 CMakeFiles/Makefile2:118: recipe for target 'game_engine_1/Sources/CMakeFiles/game_engine_1.dir/all' failed make[2]: *** [game_engine_1/Sources/CMakeFiles/game_engine_1.dir/all] Error 2 CMakeFiles/Makefile2:125: recipe for target 'game_engine_1/Sources/CMakeFiles/game_engine_1.dir/rule' failed make[1]: *** [game_engine_1/Sources/CMakeFiles/game_engine_1.dir/rule] Error 2 Makefile:138: recipe for target 'game_engine_1' failed make: *** [game_engine_1] Error 2
Je crois bien m'y prendre mais un détail m'échappe.
C'est un peu bizarre qu'il regénère 3 fois "Main.cpp.o". Je ne comprends pas encore cmake à 100%.
Donc s'il vous plaît si vous pourriez m'éclairer sur le sujet, ce serait bien aimable à vous
Amicalement,
Chlebz
Partager