Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur inconue, pliz help me :p

Code::Blocks ne reconnait pas SDL_FillRect dans ma bibliothèque.

    21 octobre 2006 à 20:37:13

    Bonjour vous tous ^^ Ou bonsoir..je sais pas trop :p .

    Toujours dans la quête du codage de mes propres extensions à SDL, me voilà bloqué au chapitre 1 : les primitives ^^.

    Voici une partie du code de mon futur "libKS_SDL_Draw.a" :

    // Fonction affichant une barre colorée dans l'aire voulue.
    void frame(SDL_Surface *surface, int x, int y, int w, int h, Uint32 color)
    {
    SDL_Rect recta;

    recta.x = x;
    recta.y = y;
    recta.w = w;
    recta.h = h;

    SDL_FillRect(surface, &recta, color);
    }



    Voici la partie correspondante dans mon header nommé pour l'occasion "KS_SDL_Draw.h" :
    void frame(SDL_Surface *surface, int x, int y, int w, int h, Uint32 color);



    Lors du Build de la bibliothèque, la compilation se termine avec 1 warning... mais ça passe. Dans le doute je re-build... plus de warning... Bon... on va dire que c'est ok.

    Maintenant je compile mon programme de test.. uniquement pour essayer... et là message d'erreur qui lui, ne passe pas ^^.

    E:\KS_SDL_Draw\libKS_SDL_Draw.a(KS_SDL_Draw.o):KS_SDL_Draw.cpp:(.text+0x121): undefined reference to `SDL_FillRect'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 1 seconds)
    0 errors, 0 warnings


    Comment ça undefined reference to `SDL_FillRect' ? L'aurais-je mal écrit ? Le fait d'avoir compilé en cpp l'aurais dérouté ?

    Je code en c/cpp sous Code::Blocks avec SDL.
    J'ai inclus SDL.h dans mon fichier KS_SDL_Draw.cpp et aussi dans mon programme de test (évidement ^^).
    J'ai aussi lié comme il le fallait la biblio de SDL à ma propre biblio....
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      22 octobre 2006 à 10:45:42

      Quand tu trouves un 'undefined reference', en génral il s'agit un problème de linkage (il ne trouve pas l'implémentation de fillrect, qui se trouve dans libsdl.a).

      As-tu bien linké les bibliothèques de la SDL ?
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        22 octobre 2006 à 11:42:44

        cf ordre de linkage:

        - libmingw32
        - libsdlmain
        - libsdldll
        • Partager sur Facebook
        • Partager sur Twitter
          22 octobre 2006 à 11:51:57

          Citation : Oragon


          Lors du Build de la bibliothèque, la compilation se termine avec 1 warning... mais ça passe.


          Non, ça ne passe pas. Quel warning ?

          Citation : Pas de titre

          Dans le doute je re-build... plus de warning... Bon... on va dire que c'est ok.


          Grave erreur. Il faut apprendre à utiliser son IDE. Un rebuild, c'est pas 'j'appuie une nouvelle fois sur le bouton build'. Evidemment qu'il n'y a plus de warnings, puis que rien n'est fait (le code est déjà compilé). Il faut faire un vrai rebuild, à savoir :

          menu build / rebuild

          ou directement : Ctrl-F11
          • Partager sur Facebook
          • Partager sur Twitter
          Music only !
            22 octobre 2006 à 18:15:12

            En fait pour le premier warning, il m'écrit (en bleu) :
            Process terminated with status 0 (0 minutes, 3 seconds)
            0 errors, 1 warnings


            Mais ça a quand même fonctionné... et j'ai rien trouvé de gênant dans l'execution.


            Oui je sais que c'est une grave erreur... mais de toutes façon ça n'a rien fait. ^^


            L'ordre de linkage ?
            moi j'ai linké :
            - libsdlmain
            - libsdldll

            J'ai nulle part vu le "- libmingw32" en question... où est-il ?
            • Partager sur Facebook
            • Partager sur Twitter
              22 octobre 2006 à 18:33:04

              Citation : Oragon

              En fait pour le premier warning, il m'écrit (en bleu) :

              Process terminated with status 0 (0 minutes, 3 seconds)
              0 errors, 1 warnings



              Refait un Build / Rebuild (ou Ctrl-F11) et montre les messages d'erreur en entier (copier/collé).
              • Partager sur Facebook
              • Partager sur Twitter
              Music only !
                22 octobre 2006 à 18:39:36

                Rebuild de la bibliothèqe : comme vous voyez, pas d'erreurs.. enfin plus...
                Project : Static library
                Compiler : GNU GCC Compiler (called directly)
                Directory : E:\KS_SDL_Draw\
                --------------------------------------------------------------------------------
                Switching to target: default
                Compiling: KS_SDL_Draw.cpp
                Linking static library: E:\KS_SDL_Draw\libKS_SDL_Draw.a
                ar.exe: creating E:\KS_SDL_Draw\libKS_SDL_Draw.a
                Process terminated with status 0 (0 minutes, 1 seconds)
                0 errors, 0 warnings



                (puis) Rebuild du programme de test :
                Project : SDL Application
                Compiler : GNU GCC Compiler (called directly)
                Directory : E:\KS_SDL_Draw\
                --------------------------------------------------------------------------------
                Switching to target: default
                Compiling: hostmain.cpp
                Linking executable: host.exe
                E:\KS_SDL_Draw\libKS_SDL_Draw.a(KS_SDL_Draw.o):KS_SDL_Draw.cpp:(.text+0x121): undefined reference to `SDL_FillRect'
                collect2: ld returned 1 exit status
                Process terminated with status 1 (0 minutes, 2 seconds)
                0 errors, 0 warnings



                Faut-il savoir un manque de rigueur de ma part. Lorsque j'ai compilé pour la première fois ma bibliothèque, code::blocks me demandait d'avoir choisit le programme pour "host" ma biblio. Hors je ne savais comment faire (je ne le sais toujours pas ^^). Alors j'ai créé deux projets dans mon espace de travail donc l'un est ma librairie, l'autre mon programme "host".
                Le problème est que les liaisons du compilateur, ensuite, sont les mêmes. On en voit les conséquence dans le premier rapport de compilation que j'ai écrit (sur ce post) :
                Linking static library: E:\KS_SDL_Draw\libKS_SDL_Draw.a
                • Partager sur Facebook
                • Partager sur Twitter
                  22 octobre 2006 à 19:18:23

                  Citation : Oragon

                  Rebuild de la bibliothèqe : comme vous voyez, pas d'erreurs.. enfin plus...

                  Project : Static library
                  Compiler : GNU GCC Compiler (called directly)
                  Directory : E:\KS_SDL_Draw\
                  --------------------------------------------------------------------------------
                  Switching to target: default
                  Compiling: KS_SDL_Draw.cpp
                  Linking static library: E:\KS_SDL_Draw\libKS_SDL_Draw.a
                  ar.exe: creating E:\KS_SDL_Draw\libKS_SDL_Draw.a
                  Process terminated with status 0 (0 minutes, 1 seconds)
                  0 errors, 0 warnings

                  Code::Blocks. OK.

                  Tu génères un bibliothèque, OK, pourquoi pas, tu dois avoir tes raisons...

                  Pourquoi ton fichier a l'extension .cpp ? Tu risques de compiler en C++. Pour compiler en, C, il faut l'extension .c.

                  Citation : Pas de titre

                  (puis) Rebuild du programme de test :

                  Project : SDL Application
                  Compiler : GNU GCC Compiler (called directly)
                  Directory : E:\KS_SDL_Draw\
                  --------------------------------------------------------------------------------
                  Switching to target: default
                  Compiling: hostmain.cpp
                  Linking executable: host.exe
                  E:\KS_SDL_Draw\libKS_SDL_Draw.a(KS_SDL_Draw.o):KS_SDL_Draw.cpp:(.text+0x121): undefined reference to `SDL_FillRect'
                  collect2: ld returned 1 exit status
                  Process terminated with status 1 (0 minutes, 2 seconds)
                  0 errors, 0 warnings



                  Là encore, tu compiles en C++...

                  Il y a un bug au niveau de l'édition de lien. En effet, il semble que la biblithèque que tu as céé ne sois pas prise en compte par ton projet. Pour ça, il faut ajouter cette bibliothèque (libKS_SDL_Draw.a) à ton projet.

                  Settings / Compiler / Linker ...

                  Citation : Pas de titre

                  Faut-il savoir un manque de rigueur de ma part. Lorsque j'ai compilé pour la première fois ma bibliothèque, code::blocks me demandait d'avoir choisit le programme pour "host" ma biblio. Hors je ne savais comment faire (je ne le sais toujours pas ^^). Alors j'ai créé deux projets dans mon espace de travail donc l'un est ma librairie, l'autre mon programme "host".


                  C'est logique, tu as 2 projets.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Music only !
                    23 octobre 2006 à 16:35:06

                    Citation : -ed-

                    Il y a un bug au niveau de l'édition de lien. En effet, il semble que la biblithèque que tu as céé ne sois pas prise en compte par ton projet. Pour ça, il faut ajouter cette bibliothèque (libKS_SDL_Draw.a) à ton projet.



                    Ui... mais il sembler lier ma bibliothèque au mauvais projet justement... il semble lier ma bibliothèque .a à ma future bibliothèque .a et pas à mon projet de test... or je vois pas comment changer ça étant donné que mes options de linkage fonctionnnent pour mes deux projets.... ^^


                    Euh.... suis-je obliger d'utiliser sdl en c ? je pensais qu'il fonctionnait sous cpp...
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      23 octobre 2006 à 18:34:01

                      Citation : Oragon

                      L'ordre de linkage ?
                      moi j'ai linké :
                      - libsdlmain
                      - libsdldll

                      J'ai nulle part vu le "- libmingw32" en question... où est-il ?



                      Uniquement si tu compiles avec MinGW :/

                      Et SDL fonctionne en CPP (source: libsdl.org).
                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 octobre 2006 à 22:11:11

                        Citation : Oragon

                        Ui... mais il sembler lier ma bibliothèque au mauvais projet justement... il semble lier ma bibliothèque .a à ma future bibliothèque .a et pas à mon projet de test... or je vois pas comment changer ça étant donné que mes options de linkage fonctionnnent pour mes deux projets.... ^^


                        C'est à toi de vérifier la constitution de ton projet. De toutes façons, tu peux demander à liker une bibliothèque même si tu n'utilises pas les fonctions. Dans ce cas, elle ne sera pas linkée, c'est tout.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Music only !
                          24 octobre 2006 à 9:40:18

                          Donc le problème viendrais surtout du langage que j'utilisais.... bon .... de toutes façon j'ai refais... mais cette fois sans génération de bibliothèque statique (uniquement avec fichiers séparés) et ça marche directement... je verrais plus tard pour en faire une bibliothèque statique.




                          _________________________________



                          Plus tard.... ^^

                          J'ai réécris ma biblio... mais cette fois j'ai tout simplement créé un unique projet ("SDL_Draw project") contenant deux sources C : celle contenant le main, et celle contenant mes fonctions graphiques.
                          un petit F9... tout marche.
                          Maintenant je veux en faire une librairie statique "*.a"... mais je ne sais pas comment faire...

                          Voici le contenue de "SDL_draw project" :

                          KS_SDL_Draw.c
                          KS_SDL_Draw.h
                          facultatif : le petit prog de test (ne fait qu'initaliser la sdl)

                          Ne vous offusquez pas ^^ je ne compte pas vous passer mes codes et dire "faites ça pour moi svp"... en fait c'est juste pour que vous ayez une meilleure vue de ce que je fais, et que vous testiez vous même...

                          Pour créer une biblio *.a, dois-je simplement :
                          - faire un nouveau projet (static lib)
                          - créer un fichier *.c, y mettre le contenu de KS_SDL_Draw.c
                          - créer un fichier *.h, y mettre le contenu de KS_SDL_Draw.h
                          - Build.

                          Et voilà.. après je n'ai plus qu'à faire un nouveau projet SDL que je lie aux sdl habituels et à KS_SDL_Draw.a et normalement je peux me servir de mes fonctions, non ?
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Erreur inconue, pliz help me :p

                          × 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