Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL_image 2.0.2 undefined IMG_Init

Sujet résolu
    7 février 2018 à 20:01:56

    Bonjour j'essaye depuis quelques jours d'intégrer la SDL_image 2.0.2 sur code blocks mais sans jamais y arriver, j'ai écumer pas mal de forums, tutoriels et vidéos. Je commence lentement a devenir fou....

    le linkage semble toujours raté:

    j'ai bien mis le /bin, le /include et le /lib dans les dossiers correspondant de ma SDL2.

    "undefined reference to 'IMG_Init' "

    Dans le build options du projets ==> linker settings ==> link librairies, comme ceci:

    • C:\Program Files (x86)\CodeBlocks\MinGW\lib\libmingw32.a
    • C:\Program Files (x86)\CodeBlocks\SDL2-2.0.7\x86_64-w64-mingw32\lib\libSDL2main.a
    • C:\Program Files (x86)\CodeBlocks\SDL2-2.0.7\x86_64-w64-mingw32\lib\libSDL2.a
    • C:\Program Files (x86)\CodeBlocks\SDL2-2.0.7\x86_64-w64-mingw32\lib\libSDL2.dll.a
    • C:\Program Files (x86)\CodeBlocks\SDL2-2.0.7\x86_64-w64-mingw32\lib\libSDL2_image.a
    • C:\Program Files (x86)\CodeBlocks\SDL2-2.0.7\x86_64-w64-mingw32\lib\libSDL2_image.dll.a


    et dans le Others linker options:

    • -lmingw32
    • -lSDL2main
    • -lSDL2
    • -lSDL2_image



    Les dossiers/fichiers de SDL_images sont dans le dossier SDL2-2.0.7\x86_64-w64-mingw32 donc normalement je n'ai pas a les relinker manuellement.

    Si ça peut aider voici mon code:

    #include <iostream>
     
    #include <SDL2/SDL.h>
     
    #include <SDL2/SDL_image.h>
     
    int main(int argc, char **argv)
    {
        if (SDL_Init(SDL_INIT_VIDEO) != 0 )
        {
            std::cout << SDL_GetError() << std::endl;
            return -1;
        }
            /* Création de la fenêtre */
     
        IMG_Init(IMG_INIT_JPG);
        SDL_Event evenements;
        SDL_Window* maFenetre(0);
        bool finFenetre (false);
        SDL_Surface* image = IMG_Load("titile.JPG");
     
        maFenetre = SDL_CreateWindow("Ma premiere application SDL2",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,800,600,SDL_WINDOW_SHOWN);
     
        if( !maFenetre )
        {
            std::cout << SDL_GetError() << std::endl;
            SDL_DestroyWindow(maFenetre);
            SDL_Quit();
     
     
        }
     
        while (!finFenetre)
        {
            SDL_WaitEvent(&evenements);
            if(evenements.window.event == SDL_WINDOWEVENT_CLOSE)
            finFenetre = true;
        }
     
        IMG_Quit();
        SDL_DestroyWindow(maFenetre);
        SDL_Quit();
     
        return 0;
     
    }



    Surtout que l'autocompletion marche, code block me suggère les fonctions de image.h. Je ne comprend pas comment ça peut marcher et pas marcher comme ça

    • Partager sur Facebook
    • Partager sur Twitter
      12 février 2018 à 19:25:10

      Salut,

      Typiquement, les erreurs de type "undefined reference to" sont des erreurs issues de l'éditeur de liens; l'outil qui, une fois que le compilateur a fait son job en générant le code binaire exécutable de chaque unité de compilation (pour faire simple: chaque fichier .cpp).

      Cet outil (l'éditeur de liens) va donc prendre tous les fichiers objets qu'il connait pour les regrouper en un exécutable, et, s'il ne trouve pas le code binaire correspondant à  l'une des fonctions auxquelles on fait appel, il ira voir dans les bibliothèques externes qu'on lui a indiquée s'il trouve "ce qui manque".

      Bien sur, s'il ne trouve pas ce qui manque, il n'aura pas d'autre choix que de s'arrêter sur une erreur, car, autrement, le programme ne pourra pas réagir "comme on s'y attend".

      Tu sembles avoir ajouté toutes les bibliothèques relatives à la SDL dont tu as besoin, si bien qu'il reste trois solutions:

      Soit l'éditeur de liens n'a pas trouvé les bibliothèques que tu lui indique, mais, dans ce cas, il devrait te lancer un message du genre "unable to find libsdl.a" avant les "undefined reference to"; soit l'ordre dans lequel tu as ajouté les différentes bibliothèques n'est pas correcte; soit, enfin, le code est compilé pour utiliser les versions dll de la SDL et l'édition de liens se fait avec la version statique (ou l'inverse)

      Dans le premier cas, il faut vérifier si le dossier dans lequel le fichier libsdl.a (et tous ses confrère) est connu de l'éditeur de lien.  S'il se trouve dans le dossier lib de gcc, tu peux partir du principe que c'est le cas.  Autrement, il faudra indiquer le chemin d'accès à ce fichier en utilisant l'option -L. (tu peux, aussi, copier les fichiers des bibliothèques dans un dossier connu par défaut par l'éditeur de liens)

      Dans le deuxième cas, il faudra trouver le "bon ordre" pour inclure les différentes bibliothèques de la SDL.

      Dans le troisième cas, il faut soit adapter les bibliothèque (prendre celle qui contienne "dll" dans leur noms) soit définir un symbole (à déterminer) qui indiquera clairement que tu veux utiliser SDL sous sa forme statique.

      A priori, comme tes bibliothèques se trouvent dans le dossier C:\Program Files (x86)\CodeBlocks\SDL2-2.0.7\x86_64-w64-mingw32\lib , j'opterais pour la première des solutions ;)

      • Partager sur Facebook
      • Partager sur Twitter
      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
        13 février 2018 à 20:17:20

        super tuto pour installer correctement SDL

        http://www.supinfo.com/articles/single/649-comment-installer-sdl-20-codeblocks-windows

        ton prog a beaucoup de lacune, pas de renderer, ne fait que charger le fichier en memoire mais n'en fait pas une texture

        mais ne fait pas d'erreur chez moi, donc respecte bien les consignes

        quand tu defini ton nouveau projet, copie bien toutes les dll dll contenu dans le rep bin de la librairie utilisée dans le repertoire du source

        exemple : pour un prog qui affiche des .png il faut la dll libpng16-16.dll, sinon l image ne s affiche pas alors que pas d erreur à la compil et le prog ne la demande pas expressement quand tu le lance

        je te mp une adresse pour telecharger un super bouquin de dev sur SDL2 pour faire un jeu. tu verras comment afficher des images

        • Partager sur Facebook
        • Partager sur Twitter
          19 février 2018 à 13:18:41

          La solution que j'ai trouvé est de tout passé (les sdl) en 32 bits pour les dll, grâce à ça tout marche, le 64bits de SDL est toujours capricieux a ce que je vois.

          Mon programme est comme ça juste pour voir si tout marche au niveau du chargement des SDL, bien entendu je comptais le changer et l'optimiser mais il a été fait un peu à "l'arrache" pour voir si ça marchait.

          -
          Edité par Rodall Juhziz 19 février 2018 à 13:19:15

          • Partager sur Facebook
          • Partager sur Twitter

          SDL_image 2.0.2 undefined IMG_Init

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown