Problèmes sur CodeBlocks avec la SDL2 [Linux] [C]

Impossible de charger une bitmap, d'ajouter l'image au projet et de trouver le SDL.dll

a marqué ce sujet comme résolu.

Salut tout le monde, Je me suis mis à la SDL2 pendant mes vacances afin de pouvoir faire un peu plus que de la console dans mes programmes C. Étant sur Linux, l’installation et la configuration de la SDL2 pour Code::Blocks était plutôt simple mais je me retrouve confronté à certains problèmes compliqués à régler du fait de mes connaissances encore faible de l’environnement Linux.

1)J’ai le code suivant

 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
//preprocessor
#include <SDL2/SDL.h>
#include <stdio.h>
#include <stdlib.h>

//global variables
const int SCREEN_WIDTH = 1280;
const int SCREEN_HEIGHT = 720;
SDL_Window *mainWindow = NULL;
SDL_Surface *mainWindowSurface = NULL;
SDL_Surface *splashIMG = NULL;

//prototypes
void cleanse();
int init();
int loadIMG();

int main( int argc, char* args[] )
{
     if(init() != 0)
     {
        printf("Echec de l'initialisation\n");
     }
     else
     {
        if(loadIMG() != 0)
        {
            printf("Echec du chargement de l'image\n");
        }
        else
        {
            SDL_BlitSurface(splashIMG, NULL, mainWindowSurface, NULL);
            SDL_UpdateWindowSurface(mainWindow);
        }
     }
     cleanse();
    return 0;
}

int init()
{
    if(SDL_Init(SDL_INIT_VIDEO) > 0)
    {
        printf("Probleme a l'initialisation de la SDL\n");
        return -1;
    }
    else
    {
        mainWindow = SDL_CreateWindow( "SDL Image Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        if(mainWindow == NULL)
        {
            printf("Probleme a la creation de la fenetre\n");
            return -1;
        }
        else
        {
            mainWindowSurface = SDL_GetWindowSurface(mainWindow);
            return 0;
        }
    }


}

void cleanse()
{
    SDL_FreeSurface(splashIMG);
    splashIMG = NULL;
    SDL_DestroyWindow(mainWindow);
    mainWindow = NULL;
    SDL_Quit();
}

int loadIMG()
{
    splashIMG = SDL_LoadBMP("Images/HelloWorld.bmp");
    if(splashIMG == NULL)
    {
        printf("Impossible d'ouvrir l'image: code d'erreur %s\n", SDL_GetError());
        return -1;
    }
    return 0;
}

`

Le code compile sans problème mais il est incapable de charger l’image qui se trouve pourtant bel et bien dans un dossier Images dans le dossier où se trouve l’exécutable du programme une fois compilé (bin/Debug). À partir de là il m’est venu l’hypothèse que le fait d’exécuter mon programme depuis Code::Blocks faisait qu’il lui était impossible de trouver ledit dossier car il était peut-être exécuté à un endroit propre à Code::Blocks. Il m’est venu deux idées pour régler ce problèmes, les deux se trouvant malheureusement impossible à résoudre

2) Je me suis dit qu’en exécutant le programme hors de Code::Blocks, il trouverait le dossier et pourrait charger l’image. Le souci c’est qu’il manque le fichier SDL.dll (ou peut importe son équivalent avec SDL2) sans lequel mon programme ne peut pas se lancer et que je n’ai absolument aucune idée de où je peux le trouver sur ma machine parce que j’ai installé les fichiers de la SDL2 en ligne de commande et que je n’ai aucune idée de où ça s’est installé.

3)J’ai donc voulu ajouter un dossier au projet dans Code::Blocks mais en faisant un clic droit sur l’icône du projet et en ajoutant un dossier virtuel, je n’arrive rien à ajouter à ce dossier même avec un glisser-déposer. Si, avec le même clic droit au même endroit je clique sur ajouter un fichier et que j’ajoute le fichier, toute l’arborescence menant au fichier va être importée (et j’ai même pas cliqué sur ajouter des fichiers par récurrence) ce qui est pas du tout pratique

Dans le meilleur des cas j’aimerais régler les trois problèmes mais si qqun pouvait m’aider à en résoudre au moins un ça me permettrait au moins de continuer le cours de SDL2 que j’ai trouvé en attendant que les autres problèmes trouvent une résolution

Merci

Je suis pas sûr Windows, mais au pire, c’est qu’une DLL …

Tu vas sur https://www.libsdl.org/download-2.0.php puis tu prends 32 ou 64 bits en fonction de ton ordi (certainement 64b si c’est un ordi récent). Puis tu prends le fichier dll …

Comme ça tu pourras le lancer en ligne de commande.

Et sinon, abandonne C::Bs, je codais déjà avec ce truc il y a 10ans … Et déjà à l’époque on trouvait ça pas ouf …

+0 -0

Je viens de télécharger le DLL sur le site et je l’ai mis dans le dossier ou se trouve mon exécutable mais quand je veux lancer mon exécutable, il me dit qu’il n’y a aucune application installée pour les fichiers "bibliothèque partagée". Pour ce qui est de Code::Blocks c’est peut-être pas le meilleur mais c’est celui auquel je suis habitué et je me sens pas de migrer vers un Visual Studio (et je sais même pas s’il existe sur linux) un Eclipse ou un CLion avec encore plus de fonctionnalités complexes dont je me servirai jamais

Au pardon, excuse moi, je n’avais pas vu que tu étais sous Linux ><"

Comme tu parlais de dll, je pensais que tu étais sous Windows !

Les dll ne s’utilisent que sous Windows ! Du coup, oublie les dll, c’est pas pour linux. Sous linux, on a des .so et parfois des .a.

Normalement, tu n’as pas à t’embêter avec les .a et .o si tu l’as installé en ligne de commande tout devrait être bien installé.

Comment compile tu en ligne de commande ? Quelle est ta distribution ? Ubuntu ?

+0 -1

Comment sais tu que tu échoues à charger l’image ? Car j’ai testé le code proposé et il marche bien (modulo la fenêtre qui se ferme quasi immédiatement par manque de SDL_Delay ou d’attente d’evenement).

Le seul changement que j’ai apporté, c’est donc l’ajout d’un delay

1
2
3
4
            SDL_BlitSurface(splashIMG, NULL, mainWindowSurface, NULL);
            SDL_UpdateWindowSurface(mainWindow);
        //Wait two seconds
        SDL_Delay( 2000 );

Voici ce que je fais (HelloWorld.bmp est une image idiote que j’ai générée avec Gimp).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
david:/tmp/sdl  tree                                                                                                                                                              
.
├── Images
│   └── HelloWorld.bmp
└── main.c

1 directory, 2 files
david:/tmp/sdl  gcc main.c -o main -lSDL2                                                                                                                                         
david:/tmp/sdl  ./main   
david:/tmp/sdl  cd Images                                                                                                                                                      david:/tmp/sdl  mv HelloWorld.bmp HelloWorld2.bmp  
david:/tmp/sdl  cd ..                                                                                               
david:/tmp/sdl  ./main                                                                                                                                                            
Impossible d'ouvrir l'image: code d'erreur Couldn't open Images/HelloWorld.bmp
Echec du chargement de l'image

`

Edit alors ca c’est marrant, une ligne présente dans le C/C depuis mon terminal ne s’affiche pas. C’est une ligne où je renomme l’image, de sorte que le chargement échoue

+1 -0

@Ache: Je ne compile pas en ligne de commande étant donné que j’utilise CodeBlocks sur Linux UbuntuGnome 17.04 @Davidbrcz: Ah effectivement ça fonctionne en ligne de commande, j’avais oublié comment lancer un programme dans un terminal et après l’adjonction d’un petit SDL_Delay c’est nickel.

Maintenant si ça pouvait fonctionner depuis CodeBlocks ça serait plus pratique donc si qqun sait comment ajouter un fichier dans un nouveau dossier (et pas toute une arborescence de dossier) ça serait franchement pratique

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte