Cependant, lorsque je tente d'utiliser cmake, j'ai l'impression que je ne lui donne pas l'argument -s USE_SDL=2 correctement.
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:
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'for2nd 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
#include <iostream>#ifdef __EMSCRIPTEN__#include <emscripten.h>#include <SDL.h>#else#include <SDL2/SDL.h>#endifbool terminer = false;
SDL_Event evenements;
SDL_Window* fenetre = 0;
SDL_Renderer *renderer;
void one_iter();
int time_to_next_frame(){return30;
}extern"C"int main(int argc, char** argv){// Notre fenêtre// Initialisation de la SDLif(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);
#elsewhile(!terminer){
one_iter();
SDL_Delay(time_to_next_frame());
}// On quitte la SDL
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(fenetre);
SDL_Quit();
#endifreturn0;
}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();
elseif( evenements.type == SDL_KEYUP && evenements.key.keysym.sym == SDLK_f){
SDL_SetWindowFullscreen(fenetre, fullscreen ? 0 : SDL_WINDOW_FULLSCREEN);
fullscreen = ! fullscreen;
}}}
24/06/2016, 12h16
Kannagi
Je connais pas tres bien Cmake mais je pense que c'est une mauvaise piste ceci :
Citation:
Il semblerait qu'il utilise les header de SDL1 au lieu de ceux de SDL2.
vu que tu fait ceci #include <SDL2/SDL.h> , il prendra bien les header de la SDL2.
(celle de la SDL1 c'est ceci : #include <SDL/SDL.h>).
Tu es sur que t'as bien link la SDL2 ?
J'ai compiler ton code et il marche , avec code block(et gcc).
il suffit juste de faire un -lSDL2 (ou sur C::B SDL2 ).
J’espère que les variables global ne sont la que pour le test ;)
24/06/2016, 12h26
Neckara
Citation:
Envoyé par Kannagi
vu que tu fait ceci #include <SDL2/SDL.h> , il prendra bien les header de la SDL2.
(celle de la SDL1 c'est ceci : #include <SDL/SDL.h>).
L'header est #include<SDL.h> vu que je compile avec emscripten.
Citation:
Tu es sur que t'as bien link la SDL2 ?
J'ai compiler ton code et il marche , avec code block(et gcc).
il suffit juste de faire un -lSDL2 (ou sur C::B SDL2 ).
De plus, si c'était un soucis de link, je n'aurais pas ce genre de messages.
Citation:
J’espère que les variables global ne sont la que pour le test ;)
Pas uniquement, mais oui c'est temporaire. C'est juste que ce n'est pas la partie du code sur laquelle je vais travailler tout de suite, inutile donc de prendre du temps à avoir un code super bien fait pour cette partie.
24/06/2016, 12h43
Kannagi
et pour emscripten on ne peut pas faire un <SDL2/SDL.h> ? (au moins t'es sur de prendre le bon header la).
24/06/2016, 13h00
Neckara
Citation:
Envoyé par Kannagi
et pour emscripten on ne peut pas faire un <SDL2/SDL.h> ? (au moins t'es sur de prendre le bon header la).
Tu viens de me donner une idée.
Emscripten a quelques fichiers d'en-têtes pour SDL et d'autres bibliothèques qui on été portés. SDL2 a été compilé pour emscripten, peut-être faut-il que je lui indique explicitement le chemin vers les fichiers d'en-têtes de ma version SDL2 installée. Il me semblait avoir eu des erreurs en le faisant, je testerais ce soir.
24/06/2016, 18h32
Neckara
Je retire ce que j'ai dit, j'arrive à compiler en ligne de commande, le problème ne peut donc que venir de l'option -s USE_SDL=2que je n'arrive pas à passer à emcc via emcmake cmake.
EDIT : J'ai déjà trouvé une erreur dans mon cmake, c'est if("${CMAKE_SYSTEM_NAME}" STREQUAL "Emscripten") pour détecter si on compile avec emscripten ou non.