2010-10-11 8 views
2

Je voudrais compiler mon code CDT:Problème d'utilisation GMP avec Eclipse C++ (CDT Helios)

#include <iostream> 
#include <gmpxx.h> 

using namespace std; 

int main (void) { 
    mpz_class a, b, c; 
    a = 1234; 
    b = "-5678"; 
    c = a+b; 
    cout << "sum is " << c << "\n"; 
    cout << "absolute value is " << abs(c) << "\n"; 
    cin >> a; 
    return 0; 
} 

Quand je compilé, il y avait des erreurs comme celle-ci:

**** Build of configuration Debug for project test **** 

**** Internal Builder is used for build    **** 
g++ -LC:\Dev-Cpp\lib -lgmp -lgmpxx -otest.exe src\test.o 
src\test.o(.text$_ZN10__gmp_exprIA1_12__mpz_structS1_ED1Ev[__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::~__gmp_expr()]+0xd): In function `_gmpz_abs': 
C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_clear' 
src\test.o(.text$_ZN10__gmp_exprIA1_12__mpz_structS1_EaSEPKc[__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::operator=(char const*)]+0x55):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_set_str' 
src\test.o(.text$_ZN10__gmp_exprIA1_12__mpz_structS1_EaSEi[__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::operator=(int)]+0x14):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_set_si' 
src\test.o(.text$_ZN10__gmp_exprIA1_12__mpz_structS1_EC1Ev[__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr()]+0xd):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_init' 
src\test.o(.text$_ZlsIA1_12__mpz_structERSoS2_RK10__gmp_exprIT_S4_E[std::basic_ostream<char, std::char_traits<char> >& operator<< <__mpz_struct [1]>(std::basic_ostream<char, std::char_traits<char> >&, __gmp_expr<__mpz_struct [1], __mpz_struct [1]> const&)]+0x1c):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `operator<<(std::ostream&, __mpz_struct const*)' 
src\test.o(.text$_ZlsIA1_12__mpz_struct16__gmp_unary_exprI10__gmp_exprIS1_S1_E18__gmp_abs_functionEERSoS7_RKS3_IT_T0_E[std::basic_ostream<char, std::char_traits<char> >& operator<< <__mpz_struct [1], __gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> >(std::basic_ostream<char, std::char_traits<char> >&, __gmp_expr<__mpz_struct [1], __gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> > const&)]+0x6b):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `operator<<(std::ostream&, __mpz_struct const*)' 
src\test.o(.text$_ZrsIA1_12__mpz_structERSiS2_R10__gmp_exprIT_S4_E[std::basic_istream<char, std::char_traits<char> >& operator>><__mpz_struct [1]>(std::basic_istream<char, std::char_traits<char> >&, __gmp_expr<__mpz_struct [1], __mpz_struct [1]>&)]+0x1c):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `operator>>(std::istream&, __mpz_struct*)' 
src\test.o(.text$_ZN10__gmp_exprIA1_12__mpz_structS1_EC1IS1_16__gmp_unary_exprIS2_18__gmp_abs_functionEEERKS_IT_T0_E[__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr<__mpz_struct [1], __gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> >(__gmp_expr<__mpz_struct [1], __gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> > const&)]+0xd):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_init' 
src\test.o(.text$_ZN17__gmp_binary_plus4evalEP12__mpz_structPKS0_S3_[__gmp_binary_plus::eval(__mpz_struct*, __mpz_struct const*, __mpz_struct const*)]+0x1b):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_add' 
src\test.o(.text$__gmpz_abs[___gmpz_abs]+0x1d):C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/gmpxx.h: undefined reference to `__gmpz_set' 
collect2: ld returned 1 exit status 
Build error occurred, build is stopped 
Time consumed: 1514 ms. 

Que doit Je fais? J'ai ajouté libgmp.a et libgmpxx.a dans GCC Linker mais j'ai toujours ce problème. Merci beaucoup pour votre réponse. :)

Répondre

1

Voici la procédure correcte pour configurer les bibliothèques GNU bignum actuelles (en date du 7/2/13) avec Eclipse CDT, MinGW et msys pour C++. Pour passer à travers cela, vous devriez avoir utilisé Unix ou Linux avant, ainsi que Windows, et vous devriez avoir un vague souvenir des programmes de programmation et de compilation. C'est le point culminant de plus d'une semaine de recherche et de frustration inconditionnelle, donc si je me suis trompé quelque chose, notez-le poliment ou je vais vous faire exploser avec la puissance de mon esprit!

1) Je suppose que vous avez déjà téléchargé et installé Eclipse et MinGW et avez installé msys dans MinGW. Vous devez installer MinGW avant msys!

2) Téléchargez l'archive pour les bibliothèques GMP de gmplib.org à $ {gmp_download}. J'ai téléchargé le fichier gmp-5.1.2.tar.xz car je n'ai jamais utilisé lzip et je ne savais pas s'il était disponible dans msys.

3) Ouvrez une fenêtre msys (essentiellement un shell bash). cd $ {gmp_buid} et tar -Jxvf $ {gmp_download} /gmp-x.x.x.tar.xz

Ces options de tar sont différentes de ce que vous pouvez trouver ailleurs sur le web! -Jxvf est bon pour xz (et je pense que lzip), mais pour gzip vous utilisez -xzvf.

4) cd gmp-x.x.x et exécutez ./config.guess. Notez la sortie. Vous en aurez besoin ensuite.

5) Exécutez ./configure prefix = $ {} gmp_build --build = --enable-cxx --with-gnu-ld

Apparemment, si vous ne dites pas explicitement GMP de construire pour votre plate-forme tout construit, ce qui est mauvais. L'option cxx construit les bibliothèques C++ et --with-gnu-ld lui permet de fonctionner avec ld. Assez simple.

6) faire

7) make install

EX: supposons que vous avez installé dans C:/gmp. Vous devriez avoir gmp/include/gmp.h et gmpxx.h. Vous devriez aussi avoir gmp/lib/libgmp.a, libgmp.la, libgmpxx.a, libgmpxx.la. Vous devriez également avoir un répertoire de partage avec des choses dedans.

8) Mettre en place Eclipse:

Voir la fiche projet -> Propriétés sous C/C++ build -> Environnement modifier la variable PATH et ajoutez $ {gmp_build}/include; $ {gmp_build}/lib Sous C/C++ build -> paramètres -> paramètres d'outil -> GCC Assembler -> general ajouter $ {gmp_build}/include en tant que chemin d'inclusion. Même endroit mais -> compilateur GCC C++ -> Inclut add $ {gmp_build}/include en tant que chemin d'inclusion. Même endroit -> compilateur GCC C++ -> Divers ajouter -lgmp -lgmpxx à la fin de la ligne. LA FIN DE LA LIGNE! Même endroit -> compilateur C de GCC Ajoutez les mêmes chemins d'inclusion et options diverses que précédemment. Même endroit -> MinGW C++ linker -> Bibliothèques Ajouter aux "Bibliothèques (-l)" à la fois gmp et gmpxx DANS CETTE ORDRE!Maintenant, ajoutez $ {gmp_build}/lib à "LIbrary Search Path (-L)" Sous C/C++ Général -> Chemins & Symboles -> Incudes Tab vérifier que vous avez $ {gmp_build}/include dans vos répertoires include pour Assemblage, C et C++. Si elles ne sont pas là, vous avez peut-être raté une étape antérieure. Ils devraient être automatiquement peuplés par Eclipse. Même endroit -> onglet Bibliothèques vérifiez que vous avez gmp et gmpxx DANS CET ORDRE. Il devrait déjà être peuplé. Même endroit -> onglet Chemins de bibliothèque Vérifiez $ {gmp_build}/lib qui devrait déjà être là. Hit "Appliquer" et assurez-vous de reconstruire l'index ou les changements ne prendra pas. Hit OK pour fermer. 9) Exécuter ce programme court pour vérifier votre configuration:

#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <gmp.h> 
#include <gmpxx.h> 

using namespace std; 

int main() 
{ 
    mpz_t p; 
    mpz_init_set_ui (p,3); 

    return 0; 
} 

Vos commandes doivent Compile ressembler à ceci:

g ++ "-IC: \ gmp \ include" -O0 -g3 -Wall -c -fmessage-length = 0 -lgmp -lgmpxx -o principal.o ".. \ main.cpp" g ++ "-LC: \ gmp \ lib" -o GMPDebug.exe principal.o -lgmp -lgmpxx

Notes :

1) L'ordre des options est important. Je ne sais pas tout le pourquoi, mais si la deuxième ligne de commande (qui lie le programme) a les drapeaux -lgmp -lgmpxx avant l'option -o, la liaison échouera lamentablement.

2) L'indicateur -l est difficile. Il dit en fait "Allez chercher -L pour liblibrary.a". Dans ce cas "Allez chercher dans C: \ gmp \ lib pour libgmp.a et libgmpxx.a".

3) J'ai entendu parler de bugs impliquant cout et la version 64 bits d'eclipse, donc j'utilise la version 32 bits, où je vois le même bug. :-)