Salut à tous !
Je suis en train de suivre les tutoriels Vulkan que l’on trouve sur ce site :
https://vulkan-tutorial.com/
Les tutoriels utilisent C++, ce qui est mon langage cible, mais aussi Make. Justement, j’utilise Linux donc ça fonctionne très bien chez moi, mais je voudrais tout de même réussir à utiliser CMake.
Soit le code suivant :
Avec le fichier Makefile suivant, la compilation et l’exécution fonctionnent sans problème :
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
27
28
29
30
31
32
33
34
35
36
37 #define GLFW_INCLUDE_VULKAN #include <GLFW/glfw3.h> #define GLM_FORCE_RADIANS #define GLM_FORCE_DEPTH_ZERO_TO_ONE #include <glm/vec4.hpp> #include <glm/mat4x4.hpp> #include <iostream> int main() { glfwInit(); glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan windows", nullptr, nullptr); uint32_t extensionCount = 0; vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr); std::cout << extensionCount << " extensions supported.\n"; glm::mat4 matrix; glm::vec4 vec; auto test = matrix * vec; while(!glfwWindowShouldClose(window)) { glfwPollEvents(); } glfwDestroyWindow(window); glfwTerminate(); return 0; }
En revanche, avec le fichier CMakeLists.txt suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 FLAGS = -std=c++20 -O2 LDFLAGS = -lglfw -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi VulkanTest: main.cpp g++ $(CFLAGS) -o VulkanTest main.cpp $(LDFLAGS) .PHONY: test clean test: VulkanTest ./VulkanTest clean: rm -f VulkanTest
La configuration du projet fonctionne comme attendu :
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 cmake_minimum_required(VERSION 3.13) set(EXECUTABLE_NAME tutoriel-vulkan) project(${EXECUTABLE_NAME} CXX) set(CMAKE_CXX_STANDARD 20) add_executable(${EXECUTABLE_NAME} main.cpp) find_package(Vulkan REQUIRED) include_directories(${Vulkan_INCLUDE_DIRS}) target_link_libraries(${EXECUTABLE_NAME} Vulkan::Vulkan) find_package(glm REQUIRED) include_directories(${GLM_INCLUDE_DIRS}) target_link_libraries(${EXECUTABLE_NAME} glm::glm) find_package(glfw3 REQUIRED) include_directories(${GLFW_INCLUDE_DIRS}) target_link_libraries(${EXECUTABLE_NAME} ${GLFW_LIBRARIES})
Mais par contre, la compilation échoue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 $ cmake .. -- The CXX compiler identification is GNU 13.1.1 -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/lib64/ccache/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Found Vulkan: /lib64/libvulkan.so (found version "1.3.243") found components: glslc glslangValidator -- Configuring done (0.3s) -- Generating done (0.0s) -- Build files have been written to: /home/yoann/program/C++/tutoriel-vulkan/build
Il semble bien qu’il ne parvient pas à lier l’exécutable avec la bibliothèque Glfw, alors que, clairement, elle est installée sur mon système vu que la compilation fonctionne avec le fichier Makefile. Ceci, en dépit des directives que j’ai mises dans le fichier CMakeLists.txt. Clairement, j’ai fait une erreur dans ce fichier CMakeLists.txt, mais je ne sais pas comment corriger l’erreur. Quelqu’un a-t-il une idée pour m’aider ?
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 $ cmake --build . [ 50%] Building CXX object CMakeFiles/VulkanTest.dir/main.cpp.o [100%] Linking CXX executable VulkanTest /usr/bin/ld*: CMakeFiles/VulkanTest.dir/main.cpp.o*: dans la fonction «*main*»*: main.cpp:(.text+0x9)*: référence indéfinie vers «*glfwInit*» /usr/bin/ld*: main.cpp:(.text+0x18)*: référence indéfinie vers «*glfwWindowHint*» /usr/bin/ld*: main.cpp:(.text+0x37)*: référence indéfinie vers «*glfwCreateWindow*» /usr/bin/ld*: main.cpp:(.text+0xa0)*: référence indéfinie vers «*glfwPollEvents*» /usr/bin/ld*: main.cpp:(.text+0xac)*: référence indéfinie vers «*glfwWindowShouldClose*» /usr/bin/ld*: main.cpp:(.text+0xc1)*: référence indéfinie vers «*glfwDestroyWindow*» /usr/bin/ld*: main.cpp:(.text+0xc6)*: référence indéfinie vers «*glfwTerminate*» collect2: erreur: ld a retourné le statut de sortie 1 gmake[2]: *** [CMakeFiles/VulkanTest.dir/build.make:98: VulkanTest] Error 1 gmake[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/VulkanTest.dir/all] Error 2 gmake: *** [Makefile:91: all] Error 2
À bientôt.
Partager