Partage
  • Partager sur Facebook
  • Partager sur Twitter

utiliser SDL2 et SDL_mixer 2.0 mingw + sublime txt

Problème, pour compiler un projet comportant SDL2 et SDL_mixer 2.0

Sujet résolu
    5 septembre 2021 à 17:30:10

    Bonjour, je souhaite créer un "rickroll.exe" avec une image toute simple et un petite musique de fond, tout cela en langage C et avec SDL2.
    J'ai réussi à créer la fenêtre, insérer l'image, mais problème, je galère avec SDL_mixer 2.0.....

    En effet j'utilise comme éditeur de texte Sublime text 3 et comme compilateur mingw la version 32 bit (afin de pouvoir exécuter mes .exe sur n'importe quel système windows qu'il soit en 32/64 bit... bref...).

    Voici mon problème: je n'arrive pas à utiliser SDL_mixer 2.0, c'est-à-dire, qu'à la compilation j'ai une erreur de type "undefined reference to......SDL_mixer quelque chose......".

    Pour compiler mon projet j'utilise un MakeFile, dont voici le code source:

    build:
    	gcc -Wfatal-errors \
    	-std=c99 \
    	./*.c \
    	-I"C:\Developpement\sdlib\include\SDL2" "C:\Developpement\SDL2_mixer\i686-w64-mingw32\include\SDL2" \
    	-L"C:\Developpement\sdlib\lib" "C:\Developpement\SDL2_mixer\i686-w64-mingw32\lib" \
    	-lmingw32 \
    	-lSDL2main \
    	-lSDL2 \
    	-o "C:/Users/i7Matisse/Documents/DEV/C/Rick Roll/Output/RickRoll-V1.exe"

    Grâce à ce MakeFile je n'ai plus le dit problème "undefined reference ......." mais, j'ai un autre problème, lorsque je compile grâce à ce MakeFile, il me retourne une autre erreur, une erreur de type: unable to find: "C:\Developpement\SDL2_mixer........" : permission denied    :

    C:\Users\i7Matisse\Documents\DEV\C\Rick Roll\src>mingw32-make
    gcc -Wfatal-errors \
    -std=c99 \
    ./*.c \
    -I"C:\Developpement\sdlib\include\SDL2" "C:\Developpement\SDL2_mixer\i686-w64-mi
    ngw32\include\SDL2" \
    -L"C:\Developpement\sdlib\lib" "C:\Developpement\SDL2_mixer\i686-w64-mingw32\lib
    " \
    -lmingw32 \
    -lSDL2main \
    -lSDL2 \
    -o "C:/Users/i7Matisse/Documents/DEV/C/Rick Roll/Output/RickRoll-V1.exe"
    c:/developpement/mingw/winlibs-i686-posix-dwarf-gcc-11.2.0-mingw-w64-9.0.0-r1/mi
    ngw32/bin/../lib/gcc/i686-w64-mingw32/11.2.0/../../../../i686-w64-mingw32/bin/ld
    .exe: cannot find C:\Developpement\SDL2_mixer\i686-w64-mingw32\include\SDL2: Per
    mission denied
    c:/developpement/mingw/winlibs-i686-posix-dwarf-gcc-11.2.0-mingw-w64-9.0.0-r1/mi
    ngw32/bin/../lib/gcc/i686-w64-mingw32/11.2.0/../../../../i686-w64-mingw32/bin/ld
    .exe: cannot find C:\Developpement\SDL2_mixer\i686-w64-mingw32\lib: Permission d
    enied
    collect2.exe: error: ld returned 1 exit status
    mingw32-make: *** [makefile:2: build] Error 1

    Pouvez vous me filer un ptit coup de main ? :)

    J'ai cherché de mon côté... j'ai seulement trouvé une histoire d'option "-L" qui manquait....... mais c'était pour la compilation d'une library, or, ce n'est pas mon cas x)

    PS: Lorsque je n'utilise pas SDL_mixer 2.0 et uniquement les librabries standart du C et SDL2, toujours avec mon MakeFile (sans les lignes:

    C:\Developpement\SDL2_mixer\i686-w64-mingw32\include\SDL2
    C:\Developpement\SDL2_mixer\i686-w64-mingw32\lib

     je n'ai aucun problème de compilation, ce n'est que depuis l'ajout de SDL_mixer 2.0 et l'ajout de ces lignes dans mon MakeFile que j'ai eu ces problèmes.

    Mon main.c:

    #include "headers.h"
    
    int main(int argc, char *argv[])
    {
    	RickRoll();
    	return 0;
    }
    
    int RickRoll(void)
    {
    	/* Initialisation de SDL2 */
    	SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
    
    /* *************************************************************** */
    
    
    	/* Initialisations de fenetre + image RickRoll */
    	SDL_Window *window = NULL;
    	window = SDL_CreateWindow("Never Gonna Give You Up !", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 850, 678, SDL_WINDOW_SHOWN);
    
    	SDL_Renderer *renderer = NULL;
    	renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    
    	SDL_Surface *img = NULL;
    	img = SDL_LoadBMP("rickroll.bmp");
    
    	SDL_Texture *textureIMG = NULL;
    	textureIMG = SDL_CreateTextureFromSurface(renderer,img);
    
    	SDL_FreeSurface(img);
    
    
    	if (img == NULL)
    	{
    		fprintf(stderr, "Erreur SDL_LoadBMP: '%s'\n",SDL_GetError());
    		goto exit;
    	}
    	
    
    	if (textureIMG == NULL)
    	{
    		fprintf(stderr, "Erreur SDL_CreateTextureFromSurface: '%s'\n", SDL_GetError());
    		goto exit;
    	}
    
    
    /* *************************************************************** */
    
    
    	/* Charger la musique du RickRoll (refraint) */
    	if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0)
    	{
    		fprintf(stderr, "Erreur Mix_OpenAudio: '%s'\n", SDL_GetError());
    		goto exit;
    	}
    	Mix_Music *bgm = Mix_LoadMUS("rickroll.mp3");
    
    	Mix_PlayMusic(bgm, -1);
    
    
    
    /* *************************************************************** */
    
    
    	/* boucle programme */
    	unsigned int running = 1;
    	while (running == true)
    	{
    		SDL_Event event;
    		SDL_PollEvent(&event);
    		if (event.type == SDL_QUIT)
    		{
    			running = false;
    			goto exit;
    		}
    		/* afficher pour sûr, l'image RickRoll */
    		SDL_RenderClear(renderer);
    		SDL_RenderCopy(renderer, textureIMG, NULL, NULL);
    		SDL_RenderPresent(renderer);
    	}
    
    
    /* *************************************************************** */
    
    
    	exit:
    	/* On détruit le renderer, la fenêtre, quitte SDL2, et libère de la RAM */
    	SDL_DestroyRenderer(renderer);
    	SDL_DestroyWindow(window);
    	Mix_FreeMusic(bgm);
    	Mix_Quit();
    	SDL_Quit();
    	return EXIT_SUCCESS;
    }

    mon headers.h:

    /* Includes/Headers */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <SDL2/SDL.h>
    #include <SDL2/SDL_mixer.h>
    #define true 1
    #define false 0
    
    
    /* prototypes */
    int RickRoll(void);

    Désolé du dérangement, merci de votre aide en avance :))))


    • Partager sur Facebook
    • Partager sur Twitter
      5 septembre 2021 à 17:56:48

      Tu n'as pas un fichier lib à lier, du genre : -lSDL_mixer
      • Partager sur Facebook
      • Partager sur Twitter
        5 septembre 2021 à 18:19:58

        un fichier lib ?

        je ne pense pas, j'ai que ça avec ma library SDL_mixer 2.0,

        Après ça dépend, il se trouverait où ce fichier ?

        • Partager sur Facebook
        • Partager sur Twitter
          5 septembre 2021 à 18:46:13

          C'est comme le port-salut, dans le répertoire lib.

          EDIT:

          Ce Makefile ne peut pas marcher:

          build:
              gcc -Wfatal-errors \
              -std=c99 \
              ./*.c \
              -I"C:\Developpement\sdlib\include\SDL2" "C:\Developpement\SDL2_mixer\i686-w64-mingw32\include\SDL2" \
              -L"C:\Developpement\sdlib\lib" "C:\Developpement\SDL2_mixer\i686-w64-mingw32\lib" \
              -lmingw32 \
              -lSDL2main \
              -lSDL2 \
              -o "C:/Users/i7Matisse/Documents/DEV/C/Rick Roll/Output/RickRoll-V1.exe"


          1. Il faut répéter -I (grand i) ainsi que -L pour chaque répertoire

          2. Il faut ajouter les librairies de SDL_mixer avec -l

          -
          Edité par SpaceIn 5 septembre 2021 à 18:58:00

          • Partager sur Facebook
          • Partager sur Twitter
            5 septembre 2021 à 18:55:14

            Et ceux là :

            libSDL2_mixer.a

            libSDL2_mixer.dll.a

            Un peu de lecture : Installer et configurer une bibliothèque

            -
            Edité par rouIoude 5 septembre 2021 à 18:56:29

            • Partager sur Facebook
            • Partager sur Twitter
              5 septembre 2021 à 19:02:23

              HAHA trouvé !

              mais.... ça ne résout toujours pas mon problème... mon problème c'est que je ne sais pas comment mettre plusieurs "paths" à une option de l'éditeur de lien, je m'explique...

              Si je fais par exemple l'option "-I" comment je fais pour justement utiliser 2 bibliothèques ?

              Dois-je mettre 2 fois l'option -I suivis du chemin vers le dossier Include en question ?

              par exemple:

              -I "C:\.....\SDL2\include"
              et une seconde fois:
              -I "C:\.......\SDL_mixer\include"

              Dois je faire comme ceci ? (idem pour l'option -L et -l...?)

              Cordialement.

              -
              Edité par Spectrefr 5 septembre 2021 à 19:41:43

              • Partager sur Facebook
              • Partager sur Twitter
                6 septembre 2021 à 15:50:34

                Les gens sensés utilisent pkg-config ou au pire CMake.

                Avec MSYS2 si tu es fan de gcc/clang tu as rien d'autre à faire qu'installer les paquets (sauf si tu préfères gérer les bibliothèques à la main, bon courage) :

                • mingw-w64-x86_64-SDL2
                • mingw-w64-x86_64-SDL2_image
                • mingw-w64-x86_64-SDL2_mixer
                • mingw-w64-x86_64-SDL2_ttf

                Ensuite suffit de compiler avec $(pkg-config --libs --cflags sdl2 SDL2_image SDL2_mixer SDL2_ttf)

                -
                Edité par markand 6 septembre 2021 à 15:51:16

                • Partager sur Facebook
                • Partager sur Twitter

                l'azerty est aux dispositions ce que subversion est aux SCM

                  6 septembre 2021 à 16:05:44

                  Spectrefr a écrit:

                  Dois-je mettre 2 fois l'option -I suivis du chemin vers le dossier Include en question ?

                  Oui, il faut les répéter pour chaque chemin.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 septembre 2021 à 14:40:30

                    Ok, j'ai fait comme vous m'avez dit, c'est-à-dire:

                    build:
                    	gcc -Wfatal-errors \
                    	-std=c99 \
                    	./*.c \
                    	-I"C:\Developpement\sdlib\include\SDL2" \
                    	-L"C:\Developpement\sdlib\lib" \
                    	-I"C:\Developpement\SDL2_mixer\i686-w64-mingw32\include\SDL2" \
                    	-L"C:\Developpement\SDL2_mixer\i686-w64-mingw32\lib" \
                    	-lmingw32 \
                    	-lSDL2main \
                    	-lSDL2 \
                    	-o "C:/Users/i7Matisse/Documents/DEV/C/Rick Roll/Output/RickRoll-V1.exe"

                    Mettre une option "-I" ou "L" pour chaque chemins (comme dans le tuto et comme rouloude a dit...).

                    Or, j'ai toujours une erreur:

                    C:\Users\i7Matisse\Documents\DEV\C\Rick Roll\src>mingw32-make
                    gcc -Wfatal-errors \
                    -std=c99 \
                    ./*.c \
                    -I"C:\Developpement\sdlib\include\SDL2" \
                    -L"C:\Developpement\sdlib\lib" \
                    -I"C:\Developpement\SDL2_mixer\i686-w64-mingw32\include\SDL2" \
                    -L"C:\Developpement\SDL2_mixer\i686-w64-mingw32\lib" \
                    -lmingw32 \
                    -lSDL2main \
                    -lSDL2 \
                    -o "C:/Users/i7Matisse/Documents/DEV/C/Rick Roll/Output/RickRoll-V1.exe"
                    c:/developpement/mingw/winlibs-i686-posix-dwarf-gcc-11.2.0-mingw-w64-9.0.0-r1/mi
                    ngw32/bin/../lib/gcc/i686-w64-mingw32/11.2.0/../../../../i686-w64-mingw32/bin/ld
                    .exe: C:\Users\I7MATI~1\AppData\Local\Temp\ccsvnv6E.o:main.c:(.text+0x192): unde
                    fined reference to `Mix_OpenAudio'
                    c:/developpement/mingw/winlibs-i686-posix-dwarf-gcc-11.2.0-mingw-w64-9.0.0-r1/mi
                    ngw32/bin/../lib/gcc/i686-w64-mingw32/11.2.0/../../../../i686-w64-mingw32/bin/ld
                    .exe: C:\Users\I7MATI~1\AppData\Local\Temp\ccsvnv6E.o:main.c:(.text+0x1d0): unde
                    fined reference to `Mix_LoadMUS'
                    c:/developpement/mingw/winlibs-i686-posix-dwarf-gcc-11.2.0-mingw-w64-9.0.0-r1/mi
                    ngw32/bin/../lib/gcc/i686-w64-mingw32/11.2.0/../../../../i686-w64-mingw32/bin/ld
                    .exe: C:\Users\I7MATI~1\AppData\Local\Temp\ccsvnv6E.o:main.c:(.text+0x1e6): unde
                    fined reference to `Mix_PlayMusic'
                    c:/developpement/mingw/winlibs-i686-posix-dwarf-gcc-11.2.0-mingw-w64-9.0.0-r1/mi
                    ngw32/bin/../lib/gcc/i686-w64-mingw32/11.2.0/../../../../i686-w64-mingw32/bin/ld
                    .exe: C:\Users\I7MATI~1\AppData\Local\Temp\ccsvnv6E.o:main.c:(.text+0x26d): unde
                    fined reference to `Mix_FreeMusic'
                    c:/developpement/mingw/winlibs-i686-posix-dwarf-gcc-11.2.0-mingw-w64-9.0.0-r1/mi
                    ngw32/bin/../lib/gcc/i686-w64-mingw32/11.2.0/../../../../i686-w64-mingw32/bin/ld
                    .exe: C:\Users\I7MATI~1\AppData\Local\Temp\ccsvnv6E.o:main.c:(.text+0x272): unde
                    fined reference to `Mix_Quit'
                    collect2.exe: error: ld returned 1 exit status
                    mingw32-make: *** [makefile:2: build] Error 1

                     Encore merci de m'aider :D, je ne laisse pas tomber !



                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 septembre 2021 à 15:04:49

                      rouIoude a écrit:

                      Et ceux là :

                      libSDL2_mixer.a

                      libSDL2_mixer.dll.a

                      Et ceux la, tu ne les aurais pas oublié ? 

                      -lSDL2_mixer -lSDL2_mixer.dll



                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 septembre 2021 à 19:46:01

                        CA MARCHE !!!!!!!!!!!!!!!!!!!!!!!!!

                        MERCI !!! MERCI INFINIMENT !!!!!!!!!!!

                        Merci rouloude !!!!!! :DDDDDDDDDDDDD

                        -
                        Edité par Spectrefr 8 septembre 2021 à 19:57:15

                        • Partager sur Facebook
                        • Partager sur Twitter

                        utiliser SDL2 et SDL_mixer 2.0 mingw + sublime txt

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        • Editeur
                        • Markdown