Partage
  • Partager sur Facebook
  • Partager sur Twitter

main.c:(.text+0x20d): undefined reference to `pow' ...

Hein ? c'est quoi le delire ?

Sujet résolu
Anonyme
    21 novembre 2008 à 20:36:40

    Et bien le bonsoir !

    Voila, il m'arrive peut souvent de me servir de la librairie mathématique standart et quand je l'utilise, c'est pour opengl. Enfin bon ! Toujours est-il que j'ai utilisé cette lib avec le gcc de mon iTouch, passons ! Alors j'ai récupéré mon code du Touch a mon ordi (vive ssh, désolé matéo, je connaissais), un code qui fonctionnait tres bien et j'ai voulu le compiler sur mon ordi ... et ...
    pierre@pierre-sda-laptop:/media/disk/dev/utils/terra$ gcc -o test main.c
    /tmp/ccFlresv.o: In function `hq_complex1_resolve':
    main.c:(.text+0x20d): undefined reference to `pow'
    main.c:(.text+0x22a): undefined reference to `pow'
    main.c:(.text+0x245): undefined reference to `pow'
    main.c:(.text+0x26e): undefined reference to `pow'
    main.c:(.text+0x291): undefined reference to `pow'
    /tmp/ccFlresv.o: In function `hq_func_resolve':
    main.c:(.text+0x464): undefined reference to `tan'
    main.c:(.text+0x483): undefined reference to `sin'
    main.c:(.text+0x4c8): undefined reference to `cos'
    main.c:(.text+0x4f4): undefined reference to `tan'
    main.c:(.text+0x513): undefined reference to `cos'
    collect2: ld a retourné 1 code d'état d'exécution


    Et la, je dis :euh: ! math.h est pas censé etre une lib standart qu'on a pas besoin d'inclure ?

    Bon pour ceux que ca intéresse, voila le code (mais je suis pas convaicu que l'erreur soit la !)
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define PI 3.141593654
    
    double val_abs(double v)
    {
      if(v < 0)
        v = -v;
      
      return v;
    }
    
    // hq pour HeartQuake (tremblement de terre)
    
    // cette classe ne durerai pas dans un prog purement mathématique,
    // mais dans notre cas, ca suffit !
    typedef struct hq_polynom
    {
      double x_4;
      double x_3;
      double x_2;
      double x_1;
      double x_0;
    } hq_polynom;
    
    hq_polynom* hq_polynom_create(double fx_4, double fx_3, double fx_2, double fx_1, double fx_0)
    {
      hq_polynom* create = malloc(sizeof(hq_polynom));
    
      create->x_4 = fx_4;
      create->x_3 = fx_3;
      create->x_2 = fx_2;
      create->x_1 = fx_1;
      create->x_0 = fx_0;
      
    //  printf("polynom créé : %lfx^4 + %lfx^3 + %lfx^2 + %lfx + %lf\n", fx_4, fx_3, fx_2, fx_1, fx_0);
    //  printf(">> %lfx^4 + %lfx^3 + %lfx^2 + %lfx + %lf\n", create->x_4, create->x_3, create->x_2, create->x_1, create->x_0);
      
      return create;
    }
    
    double hq_polynom_resolve(hq_polynom* poly, double x)
    {
      double result = 0;
      
      result += poly->x_4*x*x*x*x;  
      result += poly->x_3*x*x*x;  
      result += poly->x_2*x*x;  
      result += poly->x_1*x;  
      result += poly->x_0;  
      
      return result;
    }
    
    void hq_polynom_delete(hq_polynom* poly)
    {
      free(poly);
    }
    
    // hq_complex1 :
    typedef struct hq_complex1
    {
      double a;
      double b;
      double c;
    } hq_complex1;
    
    hq_complex1* hq_complex1_new(double a, double b, double c)
    {
      hq_complex1* crea = malloc(sizeof(hq_complex1));
      
      crea->a = a;
      crea->b = b;
      crea->c = c;
      
      return crea;
    }
    
    void hq_complex1_delete(hq_complex1* comp)
    {
      free(comp);
    }
    
    double hq_complex1_resolve(hq_complex1* comp, double x)
    {
      
      if(x == 0)
        x = 1/pow(10,10);
    
      double res = 0;
      double a = comp->a;
      double b = comp->b;
      double c = comp->c;
      
      res = -b*pow(x, 4)/(pow(x, 4)+ pow(a*x, 2))+c;
      res = -b*pow(x,4)/pow(a*x-a, 2)+c; // complex 2
    
      
      if(res < 0)
        res = 0;
      
      return res;
    }
    
    // hq_guid
    typedef struct hq_guid
    {
      double alpha;
      double pts_base_x;
      double pts_base_y;
      
      double interval_start;
      double interval_end;
    } hq_guid;
    
    hq_guid* hq_guid_new(double alpha, double x, double y, double start, double end)
    {
      hq_guid* crea = malloc(sizeof(hq_guid));
      
      crea->alpha = alpha;
      crea->pts_base_x = x;
      crea->pts_base_y = y;
      crea->interval_start = start;
      crea->interval_end = end;
      
      return crea;
    }
    
    void hq_guid_delete(hq_guid* gui)
    {
      free(gui);
    }
    
    typedef struct hq_func
    {
      hq_guid* func_guid;
      hq_complex1* poly_head;
      hq_polynom* poly_foo;
    } hq_func;
    
    hq_func* hq_func_new(hq_guid* guid, hq_complex1* head, hq_polynom* foo)
    {
      hq_func* crea = malloc(sizeof(hq_func));
      
      crea->func_guid = guid;
      crea->poly_head = head;
      crea->poly_foo = foo;
    }
    
    void hq_func_delete(hq_func* func)
    {
      hq_guid_delete(func->func_guid);
      hq_complex1_delete(func->poly_head);
      hq_polynom_delete(func->poly_foo);
      
      free(func);
    }
    
    double hq_func_resolve(hq_func* func, double x, double y)
    {
      double a = func->func_guid->pts_base_x;
      double b = func->func_guid->pts_base_y;
      double c = func->func_guid->interval_start;
      double d = func->func_guid->interval_end;
      double e = x;
      double f = y;
      
      double alpha = func->func_guid->alpha;
      double alpha_2 = PI/2 - alpha;
      
      double x_int = 0;
      
      if(alpha == 0)
      {
        x_int = b-f;
      }
        
      else
      {
        x_int = ((e-a)-(f-b)*tan(alpha_2))*sin(alpha);
      }
      
    //  printf("eq : %lf\n", x_int);
    
      double h= 0;
      double coef = 0;
    
      if(alpha == 0)
        h= e-a;
        
      else
      {
        h = (f-b)/cos(alpha_2);
        h += ((e-a)-(f-b)*tan(alpha_2))*cos(alpha);
      }
      
    //  printf("Val : %lf\n", h);
    
      if(h<c)
      {
        coef = h;
      }
      
      if(h>d)
      {
        coef = h-d;
      }
      
    //   printf("\ncoef : %lf\n", coef);
      
      double result = 0;
      double tp = hq_complex1_resolve(func->poly_head, coef);
      double ro = hq_complex1_resolve(func->poly_head, 0);
    
      result = hq_complex1_resolve(func->poly_head, x_int) - (ro - tp);
      
      return result;
    }
    
    
    // main 
    int main() 
    {
      hq_func* func = hq_func_new(hq_guid_new(PI/4, 8,8, 0, 25),
                                  hq_complex1_new(15,25,4),
                                  hq_polynom_create(5,8,4,0,0));
    
      double i=0;
      double j=0;
      
      FILE* pipe = fopen("file.mvg", "w+");
      
      printf("[");
      
      for (i=0; i != 100; i++)
      {
         for(j=0; j != 100; j++)
         {
            double nb = hq_func_resolve(func, j/4, i/4);
            
            nb *= (256/4);
            
            if(nb <= 0)
              nb=0;
            
            int n = (int) nb;
            int x = (int) j;
            int y = (int) i;
            
            if(n != 0)
            {
              fprintf(pipe, "fill rgb(%d, %d, %d) point %d, %d\n", 256-n,256-n, 256-n, x,y);
            }
         }
         
         printf("#");
      }
      
      printf("]\n");
      
      fclose(pipe);
      
      printf("Imagemagick work ...");
      system("convert -size 100x100 xc:white -draw @file.mvg test.png");
      printf(" ok !\n");
    
      hq_func_delete(func);
      
      return EXIT_SUCCESS;
    }
    

    (c'est un morceau de moteur 3d, mais peut importe !).

    Merci de votre aide !

    Note : ah, oui, je suis sous ubuntu 8.10 !
    • Partager sur Facebook
    • Partager sur Twitter
      21 novembre 2008 à 20:42:07

      Citation : pierre_24

      pierre@pierre-sda-laptop:/media/disk/dev/utils/terra$ gcc -o test main.c
      /tmp/ccFlresv.o: In function `hq_complex1_resolve':
      main.c:(.text+0x20d): undefined reference to `pow'



      Y'a pas de quoi s'affoler. Tu as simplement oublié d'ajouter la bibliothèque m (math) à ton projet. Le fichier s'appelle libm.a et l'option de l'éditeur de lien est -lm. Il suffit donc d'ajouter -lm à la ligne de commande de l'éditeur de lien (le mieux est de le faire dans le makefile).

      • Partager sur Facebook
      • Partager sur Twitter
      Music only !
      Anonyme
        21 novembre 2008 à 20:51:04

        Matéo l'a jamais dit ! et sous le gcc du touch, cela fonctionne ! fin bon, maintenant, ca fonctionne aussi ! merci !
        • Partager sur Facebook
        • Partager sur Twitter
          21 novembre 2008 à 21:13:02

          Citation : -ed-

          l'option de l'éditeur de lien est -lm. Il suffit donc d'ajouter -ml à la ligne de commande de l'éditeur de lien



          Serait-ce moi ou tu as fait une faute de frappe?
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            21 novembre 2008 à 21:44:48

            Je crois ! au fait, ce code foire ! > http://www.siteduzero.com/forum-83-342 [...] entation.html si vous pouviez aller jeter un coup d'oeuil, ce serait sympa ! merci !
            • Partager sur Facebook
            • Partager sur Twitter
              21 novembre 2008 à 21:53:26

              Citation : Goost

              Citation : -ed-

              l'option de l'éditeur de lien est -lm. Il suffit donc d'ajouter -ml à la ligne de commande de l'éditeur de lien



              Serait-ce moi ou tu as fait une faute de frappe?


              Oui, corrigé, merci.

              Citation : Pierre_24

              Matéo l'a jamais dit !


              Il y a plein de choses qu'il n'a pas dites. Son tutoriel est une initiation. Après, il faut se former plus complètement.

              Et ne pas confondre le langage C et les outils qui servent à écrire une application (en C, par exemple).
              • Partager sur Facebook
              • Partager sur Twitter
              Music only !

              main.c:(.text+0x20d): undefined reference to `pow' ...

              × 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