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.
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
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
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!
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!
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.
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.
cd gmp-x.x.x et exécutez ./config.guess. Notez la sortie. Vous en aurez besoin ensuite.
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.
make
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.
Configurer Eclipse:
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:
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.
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".
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. :-)
Vous devez dire au compilateur quoi les bibliothèques que vous souhaitez utiliser.
g++ -lgmp -lgmpxx file.cpp -o file
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
$
Vous devrez dire au compilateur où le fichier d'en-tête.
g++ test.cpp -I/path/to/directory/that/contains/the/header -o test.exe