Problème de compilation en c avec sdl2

Fermé
lwdu76 Messages postés 65 Date d'inscription samedi 16 janvier 2021 Statut Membre Dernière intervention 8 novembre 2022 - Modifié le 16 janv. 2021 à 21:21
lwdu76 Messages postés 65 Date d'inscription samedi 16 janvier 2021 Statut Membre Dernière intervention 8 novembre 2022 - 20 janv. 2021 à 13:06
Salut, 

j'ai un problème de compilation, je ne sais si l'erreur vient de l'importation de mes fichiers (normalement ils sont dézippés en "tar.gz") ou bien avec l'exécution de cette commande gcc src\main.c -o bin/prog -I include -L lib -lmingw32 -lSDL2main -lSDL2 j'ai installé la bibliothèque de développement pour sdl2 en version 2.0.14 et la bibliothèque de développement pour sdl2_fgx en version 1.0.4.
je vous joins les fichiers pour me dire ce qu'il ne va pas et en même temps l'erreur de compilation avec l'exécution de la commande.
#include <stdlib.h>
#include <stdio.h>

#include <SDL.h>

#include "./game.h"
#include "./logic.h"
#include "./rendering.h"

int main(int argc, char *argv[])
{
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        fprintf(stderr, "Could not initialize sdl2: %s\n", SDL_GetError());
        return EXIT_FAILURE;
    }

    SDL_Window *window = SDL_CreateWindow("Procedural",
                                          100, 100,
                                          SCREEN_WIDTH, SCREEN_HEIGHT,
                                          SDL_WINDOW_SHOWN);

    if (window == NULL) {
        fprintf(stderr, "SDL_CreateWindow Error: %s\n", SDL_GetError());
        return EXIT_FAILURE;
    }

    SDL_Renderer *renderer = SDL_CreateRenderer(window, -1,
                                                SDL_RENDERER_ACCELERATED |
                                                SDL_RENDERER_PRESENTVSYNC);
    if (renderer == NULL) {
        SDL_DestroyWindow(window);
        fprintf(stderr, "SDL_CreateRenderer Error: %s\n", SDL_GetError());
        return EXIT_FAILURE;
    }

    game_t game = {
        .board = { EMPTY, EMPTY, EMPTY,
                   EMPTY, EMPTY, EMPTY,
                   EMPTY, EMPTY, EMPTY },
        .player = PLAYER_X,
        .state = RUNNING_STATE
    };

    SDL_Event e;
    while (game.state != QUIT_STATE) {
        while (SDL_PollEvent(&e)) {
            switch (e.type) {
            case SDL_QUIT:
                game.state = QUIT_STATE;
                break;

            case SDL_MOUSEBUTTONDOWN:
                click_on_cell(&game,
                              e.button.y / CELL_HEIGHT,
                              e.button.x / CELL_WIDTH);
                break;

            default: {}
            }
        }

        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
        SDL_RenderClear(renderer);
        render_game(renderer, &game);
        SDL_RenderPresent(renderer);
    }

    SDL_DestroyWindow(window);
    SDL_Quit();

    return EXIT_SUCCESS;
}


#include <math.h>
#include <SDL.h>
#include <SDL2_gfxPrimitives.h>

#include "./game.h"
#include "./rendering.h"

const SDL_Color GRID_COLOR = { .r = 255, .g = 255, .b = 255 };
const SDL_Color PLAYER_X_COLOR = { .r = 255, .g = 50, .b = 50 };
const SDL_Color PLAYER_O_COLOR = { .r = 50, .g = 100, .b = 255 };
const SDL_Color TIE_COLOR = { .r = 100, .g = 100, .b = 100 };

void render_grid(SDL_Renderer *renderer, const SDL_Color *color)
{
    SDL_SetRenderDrawColor(renderer, color->r, color->g, color->b, 255);

    for (int i = 1; i < N; ++i) {
        SDL_RenderDrawLine(renderer,
                           i * CELL_WIDTH, 0,
                           i * CELL_WIDTH, SCREEN_HEIGHT);
        SDL_RenderDrawLine(renderer,
                           0,            i * CELL_HEIGHT,
                           SCREEN_WIDTH, i * CELL_HEIGHT);
    }
}

void render_x(SDL_Renderer *renderer,
              int row, int column,
              const SDL_Color *color)
{
    const float half_box_side = fmin(CELL_WIDTH, CELL_HEIGHT) * 0.25;
    const float center_x = CELL_WIDTH * 0.5 + column * CELL_WIDTH;
    const float center_y = CELL_HEIGHT * 0.5 + row * CELL_HEIGHT;

    thickLineRGBA(renderer,
                  center_x - half_box_side,
                  center_y - half_box_side,
                  center_x + half_box_side,
                  center_y + half_box_side,
                  10,
                  color->r,
                  color->g,
                  color->b,
                  255);
    thickLineRGBA(renderer,
                  center_x + half_box_side,
                  center_y - half_box_side,
                  center_x - half_box_side,
                  center_y + half_box_side,
                  10,
                  color->r,
                  color->g,
                  color->b,
                  255);
}

void render_o(SDL_Renderer *renderer,
              int row, int column,
              const SDL_Color *color)
{
    const float half_box_side = fmin(CELL_WIDTH, CELL_HEIGHT) * 0.25;
    const float center_x = CELL_WIDTH * 0.5 + column * CELL_WIDTH;
    const float center_y = CELL_HEIGHT * 0.5 + row * CELL_HEIGHT;

    filledCircleRGBA(renderer,
                     center_x, center_y, half_box_side + 5,
                     color->r, color->g, color->b, 255);
    filledCircleRGBA(renderer,
                     center_x, center_y, half_box_side - 5,
                     0, 0, 0, 255);
}

void render_board(SDL_Renderer *renderer,
                  const int *board,
                  const SDL_Color *player_x_color,
                  const SDL_Color *player_o_color)
{
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            switch (board[i * N + j]) {
            case PLAYER_X:
                render_x(renderer, i, j, player_x_color);
                break;

            case PLAYER_O:
                render_o(renderer, i, j, player_o_color);
                break;

            default: {}
            }
        }
    }
}

void render_running_state(SDL_Renderer *renderer, const game_t *game)
{
    render_grid(renderer, &GRID_COLOR);
    render_board(renderer,
                 game->board,
                 &PLAYER_X_COLOR,
                 &PLAYER_O_COLOR);
}

void render_game_over_state(SDL_Renderer *renderer,
                            const game_t *game,
                            const SDL_Color *color)
{
    render_grid(renderer, color);
    render_board(renderer,
                 game->board,
                 color,
                 color);
}

void render_game(SDL_Renderer *renderer, const game_t *game)
{
    switch (game->state) {
    case RUNNING_STATE:
        render_running_state(renderer, game);
        break;

    case PLAYER_X_WON_STATE:
        render_game_over_state(renderer, game, &PLAYER_X_COLOR);
        break;

    case PLAYER_O_WON_STATE:
        render_game_over_state(renderer, game, &PLAYER_O_COLOR);
        break;

    case TIE_STATE:
        render_game_over_state(renderer, game, &TIE_COLOR);
        break;

    default: {}
    }
}


#ifndef RENDERING_H_
#define RENDERING_H_

void render_game(SDL_Renderer *renderer, const game_t *game);

#endif  // RENDERING_H_


#ifndef LOGIC_H_
#define LOGIC_H_

void click_on_cell(game_t *game, int row, int column);

#endif  // LOGIC_H_


les 4 codes sont inclus dans le fichier source qui est lui même inclus dans le fichier morpion et dans le fichier morpion on retrouve le fichier bin, include ( j'ai suprimmé le sous dossier sdl2 et inclus les fichiers directement dedans) et aussi le fichier lib.

EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

Merci d'y penser dans tes prochains messages.

5 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
16 janv. 2021 à 18:24
Tu utilises la commande
gcc src\main.c -o bin/prog -I include -L lib -lmingw32 -lSDL2main -lSDL2
, cette commande demande la compilation d'un seul fichier, nommé
src\main.c
.
Si tu as plusieurs fichiers sources, il faut tous les compiler.
0
lwdu76 Messages postés 65 Date d'inscription samedi 16 janvier 2021 Statut Membre Dernière intervention 8 novembre 2022
Modifié le 16 janv. 2021 à 21:17
D'accord je vais essayer.
Merci
0
lwdu76 Messages postés 65 Date d'inscription samedi 16 janvier 2021 Statut Membre Dernière intervention 8 novembre 2022
17 janv. 2021 à 11:30
Je n'ai pas réussi est ce que je peux t'envoyer un fichier zip pour tu regarde ce qu'il ne va pas
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 17 janv. 2021 à 14:46
Salut,

les 4 codes sont inclus dans le fichier source qui est lui même inclus dans le fichier morpion et dans le fichier morpion on retrouve le fichier bin, include ( j'ai suprimmé le sous dossier sdl2 et inclus les fichiers directement dedans) et aussi le fichier lib.

Tout d'abord des précisions terminologiques pour qu'on se comprenne bien.
  • main.c est un fichier (file en anglais)
  • src/ bin/ sont des répertoires (directory en anglais), et non des fichiers, les répertoires sont parfois aussi appelés "dossiers" sous Windows


ensuite, tu présentes 4 codes, mais tu n'indiques pas le nom des fichiers qui correspondent à ces codes.
  • supposons que le premier est main.c
  • supposons que le deuxième est rendering.c
  • supposons que le troisième est rendering.h
  • supposons que le quatrième est logic.h


Le fichier rendering.h contient le prototype de la fonction render_game() que le linker ne trouve pas (cf. ta capture avec le message d'erreur). Tu as l'implémentation de cette fonction dans le deuxième fichier (qu'on suppose s'appeler rendering.c - s'il s'appelle autrement, adapte). Tu dois donc compiler ce fichier, en l'indiquant au compilateur dans ta ligne de commande (ce que tu ne fais pas, car tu indiques seulement main.c).

Le fichier logic.h contient le prototype de la fonction click_on_cell() que le linker ne trouve pas (cf. ta capture avec le message d'erreur). Aucun des codes sources que tu postes ne contient cependant l'implémentation de cette fonction. Tu as besoin de disposer de ce fichier, dont on va supposer que le nom est logic.c (trouve le fichier qui contient l'implémentation de click_on_cell() et adapte si nécessaire). Tu dois donc compiler ce fichier, en l'indiquant au compilateur dans ta ligne de commande (ce que tu ne fais pas, car tu indiques seulement main.c).

Donc, en supposant que tu aies bien les fichiers src/rendering.c et src/logic.c et qu'ils contiennent bien ce que l'on suppose qu'ils contiennent, ta ligne de commande devrait être, en partant de celle proposée par Dalfab :

gcc src\main.c src\rendering.c et src\logic.c -o bin\prog -I include -L lib -lmingw32 -lSDL2main -lSDL2


Dal
0
lwdu76 Messages postés 65 Date d'inscription samedi 16 janvier 2021 Statut Membre Dernière intervention 8 novembre 2022
Modifié le 17 janv. 2021 à 15:45
j'ai essayé de compiler mais ça n'a pas fonctionné :(
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
18 janv. 2021 à 09:44
Peux-tu copier coller sur le forum la commande de compilation et tous les messages d'erreur qui suivent au lieu de faire une capture ?

Peux-tu confirmer que mes suppositions sont correctes ?

  • supposons que le premier est main.c
  • supposons que le deuxième est rendering.c
  • supposons que le troisième est rendering.h
  • supposons que le quatrième est logic.h


(...)
fonction click_on_cell() que le linker ne trouve pas (cf. ta capture avec le message d'erreur). Aucun des codes sources que tu postes ne contient cependant l'implémentation de cette fonction. Tu as besoin de disposer de ce fichier, dont on va supposer que le nom est logic.c (trouve le fichier qui contient l'implémentation de click_on_cell() et adapte si nécessaire)


D'où vient ton code ? Manifestement, ce n'est pas toi qui l'a programmé.
0
lwdu76 Messages postés 65 Date d'inscription samedi 16 janvier 2021 Statut Membre Dernière intervention 8 novembre 2022 > [Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024
18 janv. 2021 à 20:43
Non parce que je m'essaye au sdl2 et du coup j'ai cherché des exemples pour pouvoir pratiquer et comprendre son fonctionnement j'ai regardé un vidéo sur le sdl2 et j'écrivais
Pour le message d'erreur il enchaîne entre sdl_main en bleu et en rouge et un warming qui n'est pas important
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092 > lwdu76 Messages postés 65 Date d'inscription samedi 16 janvier 2021 Statut Membre Dernière intervention 8 novembre 2022
19 janv. 2021 à 12:53
Si tu n'indiques pas quelle est la commande de compilation et tous les messages d'erreur qui suivent, je ne peux pas t'aider. Les tous premiers messages sont souvent les plus signifiants.

Si tu ne confirmes pas comment s'appellent tes fichiers et ce qu'ils contiennent, et si tu disposes du fichier contenant l'implémentation de click_on_cell() et son nom, là encore, je ne peux pas t'aider.

Je ne vais pas répéter ces questions à l'infini, c'est toi qui vois si tu veux de l'aide.

Les auteurs de vidéos parfois fournissent des liens vers des URL permettant de récupérer les sources des projets réalisés.
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092 > [Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024
19 janv. 2021 à 14:31
coquille ci-dessus:
et si tu disposes du fichier contenant l'implémentation de click_on_cell() et son nom et que tu ne le fournis pas, là encore, je ne peux pas t'aider
0
lwdu76 Messages postés 65 Date d'inscription samedi 16 janvier 2021 Statut Membre Dernière intervention 8 novembre 2022
19 janv. 2021 à 15:02
https://github.com/tsoding/profun c'est le lien vers le projet
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
20 janv. 2021 à 01:34
OK, donc en supposant que tu as les fichiers include dans "include" et tes binaires de la bibliothèque SDL2 et de sdl2_fgx dans lib, essaye ceci :

gcc -o bin/prog  src\main.c src\rendering.c src\logic.c -I include -L lib -D_REENTRANT -lSDL2 -lSDL2_gfx

Sinon, il y a aussi des instructions dans le fichier README.md pour utiliser CMake.

Dal
0
lwdu76 Messages postés 65 Date d'inscription samedi 16 janvier 2021 Statut Membre Dernière intervention 8 novembre 2022
20 janv. 2021 à 13:06
D'accord
Merci
0