Bonjour,
Je n'ai aucun problème à compiler un projet SDL2 avec emscripten :
Cependant, lorsque je tente d'utiliser cmake, j'ai l'impression que je ne lui donne pas l'argument -s USE_SDL=2 correctement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part /opt/emsdk/emscripten/master/emcc %{sourceDir}/main.cpp -o %{buildDir}-html/LastGo.html -s USE_SDL=2
Il semblerait qu'il utilise les header de SDL1 au lieu de ceux de SDL2.
Est-ce que vous sauriez comment écrire le CMakeLists.txt ainsi que la commande emcmake nécessaire à la compilation d'un projet SDL2 ?
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 make [100%] Building CXX object CMakeFiles/LastGo.dir/main.cpp.o /home/neckara/git/LastGo/main.cpp:94:13: error: no matching function for call to 'SDL_SetWindowFullscreen' SDL_SetWindowFullscreen(fenetre, fullscreen ? 0 : SDL_WINDOW... ^~~~~~~~~~~~~~~~~~~~~~~ /opt/emsdk/emscripten/master/system/include/SDL/SDL_video.h:550:29: note: candidate function not viable: no known conversion from 'int' to 'SDL_bool' for 2nd argument extern DECLSPEC int SDLCALL SDL_SetWindowFullscreen(SDL_Window * window, ^ 1 error generated. ERROR:root:compiler frontend failed to generate LLVM bitcode, halting CMakeFiles/LastGo.dir/build.make:54: recipe for target 'CMakeFiles/LastGo.dir/main.cpp.o' failed make[2]: *** [CMakeFiles/LastGo.dir/main.cpp.o] Error 1 CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/LastGo.dir/all' failed make[1]: *** [CMakeFiles/LastGo.dir/all] Error 2 Makefile:76: recipe for target 'all' failed make: *** [all] Error 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part emcmake cmake . -G "Unix Makefiles" -B/tmp
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 project(LastGo) cmake_minimum_required(VERSION 2.8) add_definitions("-std=c++14") set( CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-O3") aux_source_directory(. SRC_LIST) add_executable(${PROJECT_NAME} ${SRC_LIST}) if(emscripten) add_definitions("-s USE_SDL=2") find_package(SDL2 REQUIRED) include_directories(${SDL2_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARY}) else() target_link_libraries(${PROJECT_NAME} "SDL2") endif()
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 #include <iostream> #ifdef __EMSCRIPTEN__ #include <emscripten.h> #include <SDL.h> #else #include <SDL2/SDL.h> #endif bool terminer = false; SDL_Event evenements; SDL_Window* fenetre = 0; SDL_Renderer *renderer; void one_iter(); int time_to_next_frame() { return 30; } extern "C" int main(int argc, char** argv) { // Notre fenêtre // Initialisation de la SDL if(SDL_Init(SDL_INIT_VIDEO) < 0) { std::cout << "Erreur lors de l'initialisation de la SDL : " << SDL_GetError() << std::endl; SDL_Quit(); return -1; } // Création de la fenêtre fenetre = SDL_CreateWindow("Test SDL 2.0", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN); if(fenetre == 0) { std::cout << "Erreur lors de la creation de la fenetre : " << SDL_GetError() << std::endl; SDL_Quit(); return -1; } renderer = SDL_CreateRenderer(fenetre,-1, /*SDL_RENDERER_TARGETTEXTURE|*/SDL_RENDERER_SOFTWARE/*SDL_RENDERER_ACCELERATED*/); // Création d'un SDL_Renderer utilisant l'accélération matérielle #ifdef __EMSCRIPTEN__ // void emscripten_set_main_loop(em_callback_func func, int fps, int simulate_infinite_loop); emscripten_set_main_loop(one_iter, 60, 1); #else while(!terminer) { one_iter(); SDL_Delay(time_to_next_frame()); } // On quitte la SDL SDL_DestroyRenderer(renderer); SDL_DestroyWindow(fenetre); SDL_Quit(); #endif return 0; } void quit(void) { terminer = true; } bool fullscreen = false; // The "main loop" function. void one_iter() { SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255); SDL_RenderClear(renderer); //TODO SDL_RenderPresent(renderer); while (SDL_PollEvent(&evenements)) { if(evenements.window.event == SDL_WINDOWEVENT_CLOSE) quit(); else if( evenements.type == SDL_KEYUP && evenements.key.keysym.sym == SDLK_f) { SDL_SetWindowFullscreen(fenetre, fullscreen ? 0 : SDL_WINDOW_FULLSCREEN); fullscreen = ! fullscreen; } } }
Partager