2009-01-20 8 views
1

J'observe un comportement pour lequel je trouve difficile de raisonner.Dynamic Link Error

J'ai un morceau de code comme suit:

int timer_temp_var; 

if ((timer_temp_var/1000.0) > 5.0) 
{ 
    //Do something 
} 

Cette pièce conduit à relier erreur.

> 
> dld: warning: Undefined symbol _d_fle" 
> dld: no output written make[1]: *** 
> [app.elf] Error 1 

Mais sur le remplacement de la vérification de l'égalité:

if ((timer_temp_var/1000.0) < 5.0) // replace '>' with '<'. 

Je vois pas de problème.

également au lieu de faire une division par 1000,0 si je le fais par 1000 comme suit:

if ((timer_temp_var/1000) > 5) 
    { 
     //Do something 
    } 

Je ne vois aucun problème quel que soit le type de contrôle de l'égalité.

L'application est compilée pour fonctionner sur un système d'exploitation pSOS.

Quelle est la raison d'un tel comportement?

+0

avez-vous essayé de vider le code d'assemblage généré pour voir si quelque chose de bizarre se passe? – dsm

+0

Quels compilateur, éditeur de liens et plate-forme (développement et cible) utilisez-vous? –

Répondre

2

Votre compilateur remplace l'opérateur ">" par l'appel à la fonction _d_fle(), vous devez donc lier une bibliothèque à votre exécutable.

Étonnamment "<" fonctionne bien qu'il devrait être remplacé par d_fgt() fonction qui se trouve le plus probablement dans le même lib. Le passage de 100.0 à 100 fait de l'opérande gauche de ">" un entier et il semble que la comparaison d'entier ne nécessite aucun appel de fonction - probablement il est compilé à l'instruction CPU plutôt qu'à l'appel de fonction.

EDIT: Il semble que vous ayez besoin d'une bibliothèque SFPE (émulation à virgule flottante). Avez-vous quelque chose comme libsfpe?

1

La modification de 1000.0 à 1000 indique un problème avec le fonctionnement en virgule flottante. Essayez de lancer 1000.0 à (int) et voir si vous avez des progrès.

Changer le signe < à> semble pas raisonnable de conduire à des changements ...

1

Il vous manque une bibliothèque à virgule flottante. Essayez d'inclure la bibliothèque mathématique (libm.a) et voyez si cela fait l'affaire.