web-dev-qa-db-fra.com

programme c ++ utilisant la bibliothèque GMP

J'ai installé GMP en utilisant les instructions sur ce site Web: http://www.cs.nyu.edu/exact/core/gmp/ Ensuite, j'ai cherché un exemple de programme utilisant la bibliothèque:

    #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;
}

Mais si je compile ceci en utilisant la commande: g ++ test.cpp -o test.exe, il dit gmpxx.h: aucun fichier ou répertoire de ce type. Comment puis-je réparer cela? Je suis un peu nouveau dans ce domaine. Et j'utilise MinGW.

16
Badshah

Obtenez la version actuelle ici GNU GMP Library . Assurez-vous de le configurer pour qu'il soit installé dans/usr/lib (passez --prefix =/usr pour configurer).

Ici vous avez la documentation: Manuel GNU GMP .

Vous n'utilisez pas correctement la bibliothèque. Je ne sais pas si vous pouvez accéder directement aux valeurs mpx avec les fonctions C++, mais vous avez ici un exemple de travail de ce que vous vouliez réaliser:

#include<iostream>
#include<gmp.h>

using namespace std;

int main (int argc, char **argv) {

    mpz_t a,b,c;
    mpz_inits(a,b,c,NULL);

    mpz_set_str(a, "1234", 10);
    mpz_set_str(b,"-5678", 10); //Decimal base

    mpz_add(c,a,b);

    cout<<"\nThe exact result is:";
    mpz_out_str(stdout, 10, c); //Stream, numerical base, var
    cout<<endl;

    mpz_abs(c, c);
    cout<<"The absolute value result is:";
    mpz_out_str(stdout, 10, c);
    cout<<endl;

    cin.get();

    return 0;
}

Compiler avec:

g++ -lgmp file.cpp -o file
17
someoneigna

Puisqu'il y a de très petits exemples dans les documents de la bibliothèque gmp, j'inclus un exemple d'exponentiation pour référence:

Le programme calcule 2 ^ 20000

#include <iostream>
#include <gmp.h>

using namespace std;
int main(void) {
  mpz_t result, base;
  mpz_inits(result,base,NULL);
  mpz_set_str(base, "2", 10);
  mpz_pow_ui(result, base, 20000);
  mpz_out_str(stdout, 10, result);
  return 0;
}

Compiler:g++ -o gmp_pow_test gmp_pow_test.cpp -lgmp

Courir :./gmp_pow_test

Installez la bibliothèque gmp sur Ubuntu avec les éléments suivants: Sudo apt-get install libgmp-dev libgmpxx4ldbl

7
Piyush Chauhan

Voici la procédure correcte pour configurer les bibliothèques courantes (à partir du 02/07/13) GNU bignum avec Eclipse CDT, MinGW et msys pour C++. Pour vous en sortir, vous devriez avoir utilisé Unix ou Linux avant, ainsi que Windows, et vous devriez avoir un vague souvenir de programmation et de compilation de programmes. C'est le point culminant de plus d'une semaine de recherche et de frustration hardcore, donc si je gâche quelque chose, notez-le poliment ou je le ferai 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 que vous avez installé msys dans MinGW. Vous devez installer MinGW avant msys!

  2. Téléchargez l'archive tar des bibliothèques GMP depuis gmplib.org vers $ {gmp_download}. J'ai téléchargé le 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 tar sont différentes de ce que vous pouvez trouver ailleurs sur le Web! -Jxvf est parfait 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, il construit tout, 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. make

  7. faire installer

    EX: supposons que vous ayez installé sur C:/gmp. Vous devriez avoir gmp/include/gmp.h et gmpxx.h. Vous devriez également avoir gmp/lib/libgmp.a, libgmp.la, libgmpxx.a, libgmpxx.la. Vous devriez également avoir un répertoire de partage contenant des éléments.

  8. Configurer Eclipse:

    • Aller au projet -> propriétés
    • Sous C/C++ build -> Environment éditez la variable PATH et ajoutez $ {gmp_build}/include; $ {gmp_build}/lib
    • Sous C/C++ build -> settings -> tool settings -> GCC Assembler -> general add $ {gmp_build}/include comme chemin d'inclusion.
    • Même endroit mais -> compilateur GCC C++ -> Inclut add $ {gmp_build}/include comme chemin d'inclusion.
    • Même endroit -> compilateur GCC C++ -> Divers ajoutez -lgmp -lgmpxx à la FIN de la ligne. LA FIN DE LA LIGNE!
    • Même endroit -> compilateur GCC C Ajoutez les mêmes chemins d'inclusion et options diverses qu'auparavant.
    • Même endroit -> Éditeur de liens MinGW C++ -> Bibliothèques Ajoutez aux "Bibliothèques (-l)" gmp et gmpxx DANS CET ORDRE! Ajoutez maintenant $ {gmp_build}/lib à "LIbrary Search Path (-L)"
    • Sous C/C++ General -> Paths & Symbols -> Incudes Tab, vérifiez que vous avez $ {gmp_build}/include dans vos répertoires d'inclusion pour Assembly, C et C++. S'ils ne sont pas là, vous avez peut-être gâché une étape précédente. Ils doivent être remplis automatiquement 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 la bibliothèque Recherchez $ {gmp_build}/lib qui devrait déjà être là. Appuyez sur "Appliquer" et assurez-vous de reconstruire l'index ou les modifications ne prendront pas. Appuyez sur OK pour fermer.
  9. Exécutez ce petit programme 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 de compilation devraient ressembler à ceci:

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

Remarques:

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

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

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

7
cassius

Vous devez dire au compilateur quoi les bibliothèques que vous souhaitez utiliser.

g++ -lgmp -lgmpxx file.cpp -o file
4
PLampkin

Il est probablement trop tard pour être utile, mais ...

Tout d'abord, votre programme fonctionne très bien. Comme d'autres l'ont souligné, vous devez (a) vous assurer que la bibliothèque GMP est installée (y compris son extension gmpxx et tous les fichiers pertinents), et (b) que vous indiquez au compilateur où trouver les deux fichiers d'inclusion, et les bibliothèques avec lesquelles établir des liens. Dans mon cas, les fichiers d'inclusion sont dans/opt/local/include, et les bibliothèques sont dans/opt/local/lib (où Macports les a placés :).

Voici le code:

#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 of " << a << " and " << b << " is " << c << "\n";
    cout << "absolute value is " << abs(c) << "\n";
    // cin >> a;
    return 0;
}

Voici la commande compile/link:

clang++ -o gmpxx-tst -I/opt/local/include gmpxx-tst.cpp -L/opt/local/lib -lgmpxx -lgmp

Voici ce que produit l'invocation de gmpxx-tst:

$ ./gmpxx-tst
sum of 1234 and -5678 is -4444
absolute value is 4444 
$
3
Mouse

Vous devrez dire au compilateur le fichier d'en-tête.

g++ test.cpp -I/path/to/directory/that/contains/the/header -o test.exe
3
chrisaycock