我已经使用本网站上的说明安装了GMP:http://www.cs.nyu.edu/exact/core/gmp/ 然后我找了一个使用该库的示例程序:
#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;
}
Run Code Online (Sandbox Code Playgroud)
但是如果我使用以下命令编译它:g ++ test.cpp -o test.exe,它说gmpxx.h:没有这样的文件或目录.我怎样才能解决这个问题?我对此很陌生.我正在使用MinGW.
som*_*gna 16
在这里获取GNU GMP库的实际版本.确保将其配置为安装在/ usr/lib中(传递--prefix =/usr进行配置).
这里有文档:GNU GMP手册.
您没有正确使用lib.我不知道你是否可以使用C++函数直接访问mpx值,但是,这里有一个你想要实现的工作示例:
#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;
}
Run Code Online (Sandbox Code Playgroud)
编译:
g++ -lgmp file.cpp -o file
Run Code Online (Sandbox Code Playgroud)
以下是使用Eclipse CDT,MinGW和msys for C++设置当前(截至7/2/13)GNU bignum库的正确过程.为了解决这个问题,您之前应该使用Unix或Linux,以及Windows,您应该对编程和编译程序有一个模糊的回忆.这是一个多星期的研究和铁杆挫败感的高潮,所以如果我搞砸了一些东西,请礼貌地注意它,否则我会用我的力量打击你!
我假设您已经下载并安装了Eclipse和MinGW,并已将msys安装到MinGW中.你必须在msys之前安装MinGW!
从gmplib.org下载GMP库的tarball到$ {gmp_download}.我下载了gmp-5.1.2.tar.xz因为我从未使用过lzip而且不知道它是否在msys中可用.
打开一个msys窗口(本质上是一个bash shell).cd $ {gmp_buid}和tar -Jxvf $ {gmp_download} /gmp-xxxtar.xz
这些焦油选项与您在网络上的其他地方不同!-jxvf适用于xz(我认为是lzip),但对于gzip,你使用-xzvf.
cd gmp-xxx并运行./config.guess.记下输出.你接下来需要它.
运行./configure --prefix = $ {gmp_build} --build = --enable-cxx --with-gnu-ld
显然,如果你没有明确地告诉GMP为你的平台构建,它会构建一切,这很糟糕.cxx选项构建C++库, - with-gnu-ld允许它与ld一起使用.非常直截了当.
使
make install
EX:假设你安装到C:/ gmp.你应该有gmp/include/gmp.h和gmpxx.h.你还应该有gmp/lib/libgmp.a,libgmp.la,libgmpxx.a,libgmpxx.la.您还应该有一个包含其中内容的共享目录.
设置eclipse:
运行此简短程序以验证您的设置:
#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;
}
Run Code Online (Sandbox Code Playgroud)
您的编译命令应该类似于:
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
Run Code Online (Sandbox Code Playgroud)笔记:
选项的顺序很重要.我不知道所有的问题,但如果第二个命令行(链接程序)在-o选项之前有-lgmp -lgmpxx标志,则链接将失败.
-l标志是一个棘手的标志.它实际上是说"Go-in-lib for liblibrary.a".在这种情况下,"在C:\ gmp\lib中查找libgmp.a和libgmpxx.a".
我听说过涉及cout和64位版eclipse的bug,所以我使用的是32位版本,我看到了同样的bug.:-)
由于gmp库文档中有非常小的示例,因此我提供了指数示例供参考:
程序计算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;
}
Run Code Online (Sandbox Code Playgroud)
编译:g++ -o gmp_pow_test gmp_pow_test.cpp -lgmp
跑 :./gmp_pow_test
使用以下命令在Ubuntu上安装gmp库: sudo apt-get install libgmp-dev libgmpxx4ldbl
现在有用可能为时已晚,但是......
首先,您的程序运行良好。正如其他人指出的那样,您需要 (a) 确保安装了 GMP 库(包括其 gmpxx 扩展名和所有相关文件),以及 (b) 您告诉编译器在哪里可以找到包含文件,以及要链接的库。在我的例子中,包含文件在 /opt/local/include 中,而库在 /opt/local/lib (Macports 放置它们的地方:)。
这是代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
这是编译/链接命令:
clang++ -o gmpxx-tst -I/opt/local/include gmpxx-tst.cpp -L/opt/local/lib -lgmpxx -lgmp
Run Code Online (Sandbox Code Playgroud)
以下是 gmpxx-tst 的调用产生的结果:
$ ./gmpxx-tst
sum of 1234 and -5678 is -4444
absolute value is 4444
$
Run Code Online (Sandbox Code Playgroud)