Partage

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

Hein ? c'est quoi le delire ?

Sujet résolu
anonyme
Photo
Le 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 !
Publicité
Le 21 novembre 2008 à 20:36:40
Le 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).

Music only !
anonyme
Photo
Le 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 !
Le 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?
anonyme
Photo
Le 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 !
Le 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).
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é.
  • Editeur
  • Markdown