Partage
  • Partager sur Facebook
  • Partager sur Twitter

gcc - références indéfinies

erreur de complilation

Sujet résolu
29 décembre 2012 à 10:51:29

Bonjour à tous :)

Je me suis lancé hier dans un petit projet en C ayant pour but de résoudre les équations du second degré. J'ai terminé mon code peu de temps après (c'était pas très long en meme temps ^^) mais lors de la compilation, gcc m'indique une erreur que je ne comprend pas. :( Après plusieurs recherches infructueuse je me tend vers le forum.

Voilà mon code source (les fonctions entree_nombre_decimal sont celles permettant une entree sécurisée comme indiqué dans le tuto officiel

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "entree.h"

int main()
{
    // Variables

    double a = 0;
    double b = 0;
    double c = 0;

    double delta = 0;

    double solution_1 = 0;
    double solution_2 = 0;

    // Debut du programme

    printf("Bonjour !! \n\n Ce programme resout les equations de second degre avec a, b et c tels que ax² + bx + c = 0 \n\n");

    printf("Quelle est la valeur de a ? ");
    a = entrer_nombre_decimal();

    printf("Quelle est la valeur de b ? ");
    b = entrer_nombre_decimal();

    printf("Quelle est la valeur de c ? ");
    c = entrer_nombre_decimal();

    // Calcul du discriminant

    delta = pow(b, 2) - 4*a*c; 

    if (delta < 0)
	printf("Il n'existe aucune solution à l'équation :-( Au revoir !\n\n");
    if (delta == 0)
    {
	solution_1 = (-b) / (2*a);
	printf("La solution de l'équation est %lf :-) Au revoir !\n\n", solution_1);
    }
    if (delta > 0)
    {
	solution_1 = ((-b) - sqrt(delta)) / (2*a);
	solution_2 = ((-b) + sqrt(delta)) / (2*a);
	printf("Les solutions de l'équation sont %lf et %lf :-) Au revoir !\n\n", solution_1, solution_2);
    }

    return 0;
}


Et voilà l'erreur

/tmp/cc9F566q.o: dans la fonction « main »:
main.c:(.text+0xbb): référence indéfinie vers « pow »
main.c:(.text+0x16a): référence indéfinie vers « sqrt »
main.c:(.text+0x1a9): référence indéfinie vers « sqrt »
collect2: erreur: ld a retourné 1 code d'état d'exécution


Voilà voilà, je ne vois pas en quoi la référence vers "pow" et "sqrt" est indéfinie et je ne comprend pas la dernière ligne :(
  • Partager sur Facebook
  • Partager sur Twitter
29 décembre 2012 à 10:55:25

Bonjour.

Question bête: tu compile à la main? Tu fais ton propre Makefile?

Le linker a pas "linké" la librairie math.h

Cordialement.
  • Partager sur Facebook
  • Partager sur Twitter
29 décembre 2012 à 10:58:41

Salut =D !

Si tu compiles à la main, il faut préciser à la compilation que tu utilises la bibliothéque maths.h

gcc -o program program.c -lm


Voilou :p ! ++
  • Partager sur Facebook
  • Partager sur Twitter
29 décembre 2012 à 11:15:57

Effectivement je compile à la main et j'ai pas enore trop l'habitude de gcc, je pensais que toute la librairie standard en C était linké automatiquement (je me coucherais moins bete ce soir ^^).

En tout cas probleme résoulu, merci à vous deux :)
  • Partager sur Facebook
  • Partager sur Twitter
29 décembre 2012 à 11:28:06

Citation : Ghuss

Effectivement je compile à la main et j'ai pas enore trop l'habitude de gcc, je pensais que toute la librairie standard en C était linké automatiquement (je me coucherais moins bete ce soir ^^).


Ça dépend du système d'exploitation, de où sont les librairies… Mais en général y'en a pas beaucoup de linké de base ;)
  • Partager sur Facebook
  • Partager sur Twitter
29 décembre 2012 à 18:22:48

Salut,

Citation : Ghuss

Effectivement je compile à la main et j'ai pas enore trop l'habitude de gcc, je pensais que toute la librairie standard en C était linké automatiquement (je me coucherais moins bete ce soir ^^).


Effectivement, tu n'es pas le premier à être pris au piège par cette subtilité dans l'édition des liens sous GNU/Linux. Pragmatiquement parlant, il est nécessaire de rajouter cette option lors de la compilation car les fonctions de la bibliothèque mathématique ont leur implémentation dans libm.so (resp. libm.a), tandis que le reste de la bibliothèque standard est dans libc.so (resp. libc.a). Or, gcc te permet d'omettre -lc, mais -lm n'est pas une option par défaut. Les raisons sont assez floues (tout le monde n'est pas d'accord là-dessus, en fait). Généralement, on dit que c'est historique : typiquement, que le jeu de <math.h> n'était pas répandu et lourd à lier à l'époque pré-ANSI, ou encore que nos amis mathématiciens, qui souhaitaient utiliser leur propre implémentation des fonctions de la bibliothèque mathématique, n'avaient pas trop envie de toucher au libc.so (resp. libc.a). Voilà, c'était la minute hors sujet de la soirée.

Bonne continuation.
  • Partager sur Facebook
  • Partager sur Twitter
Staff désormais retraité.
29 décembre 2012 à 18:54:14

Merci à tous pour vos réponses :) c'est vrai que c'est assez curieux comme subtilité, le C n'aura jamais finis de m'étonner ^^
  • Partager sur Facebook
  • Partager sur Twitter
31 août 2020 à 9:32:36

Cela m'a été utile à moi aussi merci !

  • Partager sur Facebook
  • Partager sur Twitter
31 août 2020 à 10:40:51

@JasonLabrie1 Bonjour, pour dire merci pas la peine de déterrer un sujet, vous avez la possibilité de cliquer sur les pouces levés des messages qui vous ont aidés.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter