2009-09-17 4 views
3

Pour une raison quelconque, chaque fois que j'ajoute le répertoire FLTK à mon chemin d'inclusion, j'obtiens un tas d'erreurs de cmath. J'utilise la version 4.2 de GCC. Voici un exemple de programme et la sortie de construction:cmath Erreurs lors de l'utilisation de FLTK

main.cpp

#include <cmath> 

int main() 
{ 
    return 0; 
} 

**** Build of configuration Debug for project CMath Test **** 

make -k all 
Building file: ../main.cpp 
Invoking: GCC C++ Compiler 
g++ -I/usr/include/FL -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp" 
In file included from ../main.cpp:1: 
/usr/include/c++/4.2/cmath:100: error: ‘::acos’ has not been declared 
/usr/include/c++/4.2/cmath:116: error: ‘::asin’ has not been declared 
/usr/include/c++/4.2/cmath:132: error: ‘::atan’ has not been declared 
/usr/include/c++/4.2/cmath:148: error: ‘::atan2’ has not been declared 
/usr/include/c++/4.2/cmath:165: error: ‘::ceil’ has not been declared 
/usr/include/c++/4.2/cmath:181: error: ‘::cos’ has not been declared 
/usr/include/c++/4.2/cmath:197: error: ‘::cosh’ has not been declared 
/usr/include/c++/4.2/cmath:213: error: ‘::exp’ has not been declared 
/usr/include/c++/4.2/cmath:229: error: ‘::fabs’ has not been declared 
/usr/include/c++/4.2/cmath:245: error: ‘::floor’ has not been declared 
/usr/include/c++/4.2/cmath:261: error: ‘::fmod’ has not been declared 
/usr/include/c++/4.2/cmath:271: error: ‘::frexp’ has not been declared 
/usr/include/c++/4.2/cmath:287: error: ‘::ldexp’ has not been declared 
/usr/include/c++/4.2/cmath:303: error: ‘::log’ has not been declared 
/usr/include/c++/4.2/cmath:319: error: ‘::log10’ has not been declared 
/usr/include/c++/4.2/cmath:335: error: ‘::modf’ has not been declared 
/usr/include/c++/4.2/cmath:354: error: ‘::pow’ has not been declared 
/usr/include/c++/4.2/cmath:376: error: ‘::sin’ has not been declared 
/usr/include/c++/4.2/cmath:392: error: ‘::sinh’ has not been declared 
/usr/include/c++/4.2/cmath:408: error: ‘::sqrt’ has not been declared 
/usr/include/c++/4.2/cmath:424: error: ‘::tan’ has not been declared 
/usr/include/c++/4.2/cmath:440: error: ‘::tanh’ has not been declared 
make: *** [main.o] Error 1 
make: Target `all' not remade because of errors. 
Build complete for project CMath Test 

g++ -v 
Using built-in specs. 
Target: x86_64-linux-gnu 
Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 
Thread model: posix 
gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7) 

Quelqu'un peut-il me dire ce qui ne va pas? Merci!

+0

Affichez la sortie de "g ++ -v" sur votre système. –

+1

Il semble que math.h manque ou quelque chose. – GManNickG

Répondre

3

La spéculation pure, mais y at-il un en-tête 'math.h' dans /usr/include/FL par hasard? Ou y at-il un autre en-tête qui est inclus par cmath?

[... un peu de temps passe ...]

spéculation encore, mais étant donné le commentaire « Oui, il y a - ce qui se passe », je spécule qu'il n'y a pas de « mathématiques .h 'header dans/usr/include - parce que s'il y avait GCC (G ++), il devrait normalement prendre le même endroit que' '. Donc, je voudrais vérifier le logiciel installé - en-têtes sous/usr/include - pour la santé mentale.

[... un peu plus le temps passe ...]

Ah, eh bien ... il semble que le problème est qu'il ya deux math.h têtes, et le compilateur est de choisir le mauvais .

Il y a quelques trucs que vous pouvez essayer. D'abord, peut-être, est de vérifier la documentation de FLTK: êtes-vous censé utiliser <FL/header.h> ou simplement <header.h> pour accéder à ses en-têtes? Si vous êtes censé utiliser la version avec le sous-répertoire, vous n'avez pas besoin d'ajouter -I/usr/include/FL à la ligne de commande de compilation; les références à <FL/header.h> seront traitées automatiquement (en recherchant /usr/include/FL/header.h lors de la numérisation /usr/include - tout comme <sys/types.h> se trouve sous /usr/include).

Si ce ne fait pas partie de la réponse, alors vous pouvez essayer d'utiliser les drapeaux:

-I/usr/include -I/usr/include/FL 

Cela dit « recherche /usr/include avant de chercher /usr/include/FL (puis la recherche /usr/include à nouveau après la recherche /usr/include/FL) ». Cela devrait résoudre le problème immédiat - cependant cela pourrait causer des problèmes avec tout ce qui est supposé inclure /usr/include/FL/math.h. Ce n'est certainement pas aussi fiable que la première option.

+0

Oui, il y en a! Que se passe-t-il? –

+0

D'accord, grâce à vous, je l'ai compris. Il y a un math.h dans mon répertoire/usr/include, mais celui dans/usr/include/FL est prioritaire. Je peux enlever le math.h dans/usr/include/FL, qui résout le problème, mais est-il possible de dire au compilateur quel math.h utiliser? –

+0

Ah! Oui, c'était de ma faute. Je suis supposé faire '#include ' et ainsi de suite. Ainsi, mon chemin d'inclusion ne doit inclure que/usr/include (Ha-ha). Merci pour l'aide. C'était très subtil pour moi. J'espère pouvoir diagnostiquer ce genre de problème à l'avenir. –

0

Scott, ajoutez -lm à la liste des indicateurs de liaison, et tout ira bien.

4

J'ai eu un problème similaire. Il a été provoqué par une création par inadvertance d'un math.h dans le chemin d'inclusion par Qt Creator créant un sous-paquetage mathématique pour moi le projet qui a caché le fichier math.h. J'ai trouvé que c'était simplement faire un find/-name math.h. Bien sûr, cela peut prendre un certain temps, mais ça les prend tous.

0

J'utilise Qt Creator 3.3.0 et a obtenu le même problème

Il est drôle que je l'ai résolu en déplaçant la ligne

#include < cmath>

à la première ligne avant les autres #includes

Il résout mes problèmes!!!

Questions connexes