IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Compiler un projet SDL2 avec emscripten et cmake [SDL 2.0]


Sujet :

SDL

  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut Compiler un projet SDL2 avec emscripten et cmake
    Bonjour,

    Je n'ai aucun problème à compiler un projet SDL2 avec emscripten :
    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
    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 : 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;
            }
        }
     
    }

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Je connais pas tres bien Cmake mais je pense que c'est une mauvaise piste ceci :
    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

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    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.

    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 ).
    Oui : target_link_libraries(${PROJECT_NAME} "SDL2").

    De plus, si c'était un soucis de link, je n'aurais pas ce genre de messages.


    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.

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    et pour emscripten on ne peut pas faire un <SDL2/SDL.h> ? (au moins t'es sur de prendre le bon header la).

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    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.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    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.

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    C'est bon, solution trouvée ^^.

    Ma détection de emscripten était juste foireuse.

    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
    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("${CMAKE_SYSTEM_NAME}" STREQUAL "Emscripten")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s USE_SDL=2 -o ${PROJECT_NAME}.html")
        # -O3 -s NO_EXIT_RUNTIME=1 -s ELIMINATE_DUPLICATE_FUNCTIONS=1
    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>
    #endif
     
     
    #include <SDL2/SDL.h>
     
     
    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;
            }
        }
     
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. compiler un projet gtk+ avec makefile
    Par akashi4444 dans le forum GTK+ avec C & C++
    Réponses: 20
    Dernier message: 08/12/2015, 19h30
  2. [Débuter] Compiler un projet créé avec une ancienne version de Qt
    Par khaled87 dans le forum Qt Creator
    Réponses: 2
    Dernier message: 05/12/2014, 11h25
  3. Compiler un projet Maven avec Maven
    Par michel.di dans le forum Maven
    Réponses: 25
    Dernier message: 07/01/2012, 10h24
  4. Compilation de projet VisualStudio generer avec CMake
    Par blazed dans le forum Systèmes de compilation
    Réponses: 0
    Dernier message: 04/12/2010, 14h46
  5. Réponses: 2
    Dernier message: 02/04/2009, 16h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo