Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 27-11-2008 18:22:55

cmm
Adhérent(e)
Lieu : Meudon
Distrib. : wheezy / jessie
Noyau : 3.2.0-4-amd64 / 3.16.0-4-amd64
(G)UI : gnome classic / mate
Inscription : 23-09-2008
Site Web

[Résolu] fonctions mathématiques en C

Bonjour,

J'essaie d'apprendre à programmer en C, en utilisant le livre "C for Linux programming in 21 days" publié par SAMS.
Inutile de préciser que cela fait nettement plus de 21 jours que j'essaie et je n'en suis qu'au Jour 17. J'ai quand même dépassé la moitié! J'ai acheté ce livre (édité en 2000) il y a plus de 5 ans (mais je ne m'y suis remis que récemment),  peut-être est-il obsolète.

jusquà la leçon du jour 16 tout s'était bien passé, j'ai pu compiler sans difficulté tous les exemples du bouquin et même faire des variantes.

La leçon du jour 17 porte sur l'usage des bibliothèques de fonction, en particulier des fonctions mathématiques: sinus, cosinus, exponentielle, logarithme... On doit paraît-il, pour pouvoir en disposer, mettre

#include <math.h>

au début du programme ce que j'ai fait. Malgré cela la compilation se passe mal. Voici ce qui se passe lorsque j'essaie de compiler un petit programme de rien du tout qui utilise les fonctions ceil(), floor(), sqrt() et cos():

16:51 charles@Lyra ~/Documents/programmes/jour17% gcc -Wall -ggdb listing17_1.c -o listing17_1
/tmp/ccQxrzZA.o: In function `main':
/home/charles/Documents/programmes/jour17/listing17_1.c:15: undefined reference to `ceil'
/home/charles/Documents/programmes/jour17/listing17_1.c:16: undefined reference to `floor'
/home/charles/Documents/programmes/jour17/listing17_1.c:19: undefined reference to `sqrt'
/home/charles/Documents/programmes/jour17/listing17_1.c:23: undefined reference to `cos'
collect2: ld a retourné 1 code d'état d'exécution
zsh: exit 1     gcc -Wall -ggdb listing17_1.c -o listing17_1
1


Visiblement le compilateur ne trouve pas les fonctions mathématiques que j'essaie d'employer. Avec le livre il y a un cdrom contenant les programmes proposés, et lorsque j'essaie de compiler ces programmes c'est exactement pareil. Donc l'erreur ne vient pas de moi.

J'ai regardé dans /usr/include/math.h, qui existe effectivement, mais qui ne contient pas les mots cos(), ni sqrt() recherchées avec un éditeur de texte. Par contre ce fichier fait appel à /usr/bits/mathcalls.h, qui lui contient cos(), sqrt() et autres.

Mais si j'essaie de mettre dans mon programme

#include </usr/include/bits/mathcalls.h>

en plus de

#include <math.h>

c'est la catastrophe, j'ai des centaines de messages d'erreur.

J'ai pensé, un moment, que c'était peut-être parce que mon ordinateur a un processeur 64 bits (un Turion), aussi j'ai essayé sur mon vieux Armada E500 qui a un pentium 32 bits, et c'est exactement pareil.

Quelqu'un a-t-il une idée sur comment faire comprendre au compilateur que je veux employer ces fonctions?

Merci d'avance et bien cordialement,

C.-M. M.

Dernière modification par cmm1934@orange.fr (27-11-2008 22:58:32)

Hors ligne

#2 27-11-2008 19:56:09

tux12
Membre
Lieu : ./
Distrib. : Squeeze
Noyau : Linux 2.6.32-5-686-bigmem
(G)UI : KDE
Inscription : 27-02-2008

Re : [Résolu] fonctions mathématiques en C

Bonjour CMM,

Avez vous  essayé de passer l'option -lm au compilateur comme conseillé ici?

Vous êtes bien sur une architecture i386?

Ma première idée était de tenter -ansi.

@+

Hors ligne

#3 27-11-2008 22:49:51

cmm
Adhérent(e)
Lieu : Meudon
Distrib. : wheezy / jessie
Noyau : 3.2.0-4-amd64 / 3.16.0-4-amd64
(G)UI : gnome classic / mate
Inscription : 23-09-2008
Site Web

Re : [Résolu] fonctions mathématiques en C

Merci tux12!

avec l'option -lm, çà marche parfaitement bien! Il me reste à comprendre pourquoi, mais çà je peux y arriver tout seul. Je n'ai rien  vu à propos de cette option dans mon bouquin, mais j'ai peut-être mal regardé.

au fait vous pouvez me dire tu, le vous me vieillit.

Bonne soirée,

C.-M. M.

Dernière modification par cmm1934@orange.fr (27-11-2008 22:50:39)

Hors ligne

#4 27-11-2008 23:11:17

tux12
Membre
Lieu : ./
Distrib. : Squeeze
Noyau : Linux 2.6.32-5-686-bigmem
(G)UI : KDE
Inscription : 27-02-2008

Re : [Résolu] fonctions mathématiques en C

Re,

Comme j'ai un peu cherché aussi dans le man, c'est l'option -l dans les options de l'éditeur de lien (linker), avec "library" valant m. On trouve effectivement dans /usr/lib/ un fichier libm.a, comme indiqué par le man (aux alentours de la ligne 4250 (etch):
option -llibrary

The linker searches a standard list of directories for the library, which is actually a file named liblibrary.a. The linker then uses this file as if it had been specified precisely by name.


Le fichier libm.a est un fichier archive:

host:/home/tux12$ file /usr/lib/libm.a
/usr/lib/libm.a: current ar archive


Le man de ar m'apprends que

ar  is  considered a binary utility because archives of this sort are most often used as libraries holding commonly needed sub&#8208;routines.


Un "ar t /usr/lib/libm.a" renvoie des noms de fichiers objets (.o) ou l'on trouve divers fichiers (par exemple k_cos.o, s_cos.o, w_cosh.o, s_ccosh.o, s_ccos.o...) que je suppose correspondre à diverses variantes de la fonction cosinus. Ça ressemble à un mécanisme de redirection vers un fichier objet adapté en fonction de certains paramètres (précision du calcul, standard C utilisé?, autres?).

Je n'ai pas été plus loin, j'écouterais avec attention tout complément d'explication. wink

Pour trouver la solution, j'avais effectué la recherche sur "undefined reference to `cos'" (avec les guillements).

Bonne soirée.

Hors ligne

#5 28-11-2008 16:45:20

cmm
Adhérent(e)
Lieu : Meudon
Distrib. : wheezy / jessie
Noyau : 3.2.0-4-amd64 / 3.16.0-4-amd64
(G)UI : gnome classic / mate
Inscription : 23-09-2008
Site Web

Re : [Résolu] fonctions mathématiques en C

Merci tux12 pour ces précisions, que je vais essayer de comprendre!

Bien cordialement,

CMM

Hors ligne

Pied de page des forums