Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème : "ld returned 1 exit status"

Sujet résolu
    2 octobre 2019 à 17:02:06

    Bonjour,

    Je suis en train d'apprendre la bibliothèque SDL et lors de la compilation de mon code, il me retourne : "ld returned 1 exit status".

    mon build log:

    g++  -o bin/Debug/projet1 obj/Debug/main.o  -L/usr/lib/x86_64-linux-gnu -lSDL  
    obj/Debug/main.o : Dans la fonction « main » :
    /home/detre/Documents/C/projet1/main.c:28 : référence indéfinie vers « IMG_Load »
    /home/detre/Documents/C/projet1/main.c:37 : référence indéfinie vers « IMG_Load »
    /home/detre/Documents/C/projet1/main.c:40 : référence indéfinie vers « IMG_Load »
    /home/detre/Documents/C/projet1/main.c:43 : référence indéfinie vers « IMG_Load »
    collect2: error: ld returned 1 exit status

    mon main.c :

    #include <stdio.h>
    #include <stdlib.h>
    #include "SDL_image.h"
    #include "SDL.h"
    #ifndef FICHIER_MAIN_H
    #define FICHIER_MAIN_H
    #include "main.h"
    #endif
    
    int main(int argc, char *argv[])
    {
        if(SDL_Init(SDL_INIT_VIDEO) == -1)
        {
            exit(1);
        }
    
        SDL_Surface *screen = NULL, *fond = NULL, *zozor = NULL, *sapin = NULL;
        SDL_Rect positionFond, positionZozor, positionSapin;
    
        positionFond.x = 0;
        positionFond.y = 0;
        positionZozor.x = 250;
        positionZozor.y = 100;
        positionSapin.x = 300;
        positionSapin.y = 130;
    
        SDL_WM_SetCaption("Le lac en montagne :)", NULL);
        SDL_WM_SetIcon(IMG_Load("images/sdl_icone.bmp"), NULL);
    
        screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_RESIZABLE | SDL_DOUBLEBUF);
    
        if(screen == NULL)
        {
            exit(1);
        }
    
        fond = IMG_Load("images/lac_en_montagne.bmp");
        SDL_BlitSurface(fond, NULL, screen, &positionFond);
    
        sapin = IMG_Load("images/saping.png");
        SDL_BlitSurface(sapin, NULL, screen, &positionSapin);
    
        zozor = IMG_Load("images/zozor.bmp");
        SDL_BlitSurface(zozor, NULL, screen, &positionZozor);
    
        SDL_Flip(screen);
        pause();
    
        SDL_FreeSurface(fond);
        SDL_FreeSurface(sapin);
        SDL_FreeSurface(zozor);
        SDL_Quit();
        return 0;
    }
    
    void pause()
    {
        int continuer = 1;
        SDL_Event event;
    
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
            }
        }
    }
    

    mon main.h :

    void pause();
    

    edit : Après quelques recherches et tests j'ai compris que c'est la bibliothèque SDL_image.h qui ne marche pas car en enlevant les fonctions de cette bibliothèque le programme remarche. Je précise que cette bibliothèque existe.

    Du coup j'aimerai savoir comment l'a faire fonctionner?

    Après plusieurs recherches j'ai enfin trouvé !

    il fallait dans la section linker settings de code::blocks ajouter :

    -lSDL_image



    -
    Edité par StanfieldHarry 3 octobre 2019 à 19:25:07

    • Partager sur Facebook
    • Partager sur Twitter
      4 octobre 2019 à 18:44:00

      Salut,

      Ce genre d'erreur est émise par l'outil que l'on appelle l'éditeur de liens : pour faire simple, il s'agit de l'outil qui va regrouper l'ensemble des fichiers objets (les fichiers qui contiennent le code binaire exécutable par le processeurs) générés lors de la compilation en un seul et unique fichier exécutable (ton "application").

      Il y a généralement quatre raisons pour lesquelles l'éditeur de liens se met à gueuler qu'il est face à "une référence indéfinie".

      • La première est, tout simplement, que tu as fais appel à une fonction de ton projet que tu as déclarée sans en fournir l'implémentation
      • la deuxième est que tu as, tout simplement, oublié de compiler le fichier d'implémentation (*.c) qui fournit le code de la fonction en question
      • la troisième est que tu as oublié d'ajouter le fichier objet généré lors de la compilation (*.o / *.obj) à la liste des fichiers objets à utiliser par l'éditeur de liens
      • la quatrième est, enfin, que tu as oublié de fournir le nom d'une bibliothèque externe dans lequel l'éditeur de liens devra aller chercher "les parties manquantes" pour générer l'exécutable final

      Dans le cas présent, le code exécutable correspondant la fonction IMG_load est, de toute évidence, fourni par l'une des différentes bibliothèques de SDL ( SDL_image), et nous sommes donc face à la quatrième possibilité ;).

      Comme tu t'en es si bien rendu compte, il "suffisait" de rajouter l'opion -lSDL_image, pour indiquer à l'éditeur de liens qu'il devait aller chercher les parties manquantes dans cette bibliothèque ;)

      • 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
        4 octobre 2019 à 21:14:01

        Merci pour tes explications approfondi, cela m'évitera de faire ce genre d'erreurs plus tard :).
        • Partager sur Facebook
        • Partager sur Twitter

        Problème : "ld returned 1 exit status"

        × 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