c++程序使用GMP库

c++ program using GMP library

本文关键字:GMP 程序 c++      更新时间:2023-10-16

我已经按照网站http://www.cs.nyu.edu/exact/core/gmp/上的说明安装了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;
}

但是如果我使用命令:g++ test.cpp -o test.exe编译它,它说gmpxx.h:没有这样的文件或目录。我该如何解决这个问题?我是新手。我用的是MinGW。

在这里获取实际版本GNU GMP库。确保您将其配置为安装在/usr/lib中(传递——prefix=/usr来配置)。

这里有文档:GNU GMP手册。

您没有正确使用lib。我不知道你是否可以直接访问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;
}
编译:

g++ -lgmp file.cpp -o file

下面是使用Eclipse CDT、MinGW和msys为c++设置当前(截至2013年7月2日)GNU bignum库的正确过程。要理解这一点,您应该以前使用过Unix或Linux,以及Windows,并且您应该对编程和编译程序有一个模糊的回忆。这是一个多星期的研究和硬核挫折的高潮,所以如果我搞砸了什么,请礼貌地记录下来,否则我会用我的思想的力量把你炸了!

  1. 我假设您已经下载并安装了Eclipse和MinGW,并在MinGW中安装了msys。您必须在安装msys之前安装MinGW !

  2. 从gmplib.org下载GMP库的tarball到${gmp_download}。我下载了gmp-5.1.2.tar。

  3. 因为我从未使用过lzip,不知道msys中是否可用。
  4. 打开msys窗口(本质上是一个bash shell)。cd ${gmp_build} and tar -Jxvf ${gmp_download}/gmp-x.x.x.tar.xz

    这些tar选项与你在网上其他地方找到的不同!-Jxvf适用于xz(我认为是lzip),但对于gzip,你可以使用- xxvf。

  5. cd gmp-x.x。然后运行。/config.guess。写下输出。

  6. 运行./configure——prefix = $ {gmp_build}——构建=——enable-cxx with-gnu-ld

    显然,如果你不明确地告诉GMP为你的平台构建,它会构建一切,这是不好的。cxx选项构建c++库,——with-gnu-ld允许它与ld一起工作。非常简单。

  7. 使

  8. make install

    EX:假设你安装到C:/gmp。您应该有gmp/include/gmp.h和gmpxx.h。您还应该有gmp/lib/libgmp。libgmp。洛杉矶,libgmpxx。libgmpxx.la。你还应该有一个文件共享目录

  9. 设置eclipse:

    • 进入项目->属性
    • 在C/c++ build -->环境下编辑PATH变量并添加${gmp_build}/include;${gmp_build}/lib
    • 在C/c++ build -> settings -> tool settings -> GCC Assembler -> general下添加${gmp_build}/include作为包含路径。
    • 相同的位置,但--> GCC c++编译器-->包括添加${gmp_build}/include作为包含路径。
    • 相同位置-> GCC c++编译器-> Miscellaneous在行尾添加-lgmp -lgmpxx。到终点了!
    • 相同的位置-> GCC C编译器添加相同的包含路径和杂项选项。
    • 相同位置-> MinGW c++链接器-> Libraries按顺序将gmp和gmpxx添加到Libraries (-l)中!现在添加${gmp_build}/lib到"库搜索路径(-L)"
    • Under C/c++ General -> Paths &Symbols --> includes选项卡检查在汇编、C和c++的include目录中是否有${gmp_build}/include。如果他们不在那里,你可能把之前的步骤搞砸了。它们应该由Eclipse自动填充。
    • 相同位置-> Libraries选项卡检查gmp和gmpxx的顺序。它应该已经被填充。
    • Same Place -> Library Paths选项卡检查${gmp_build}/lib,它应该已经存在了。点击"应用",确保你重建了索引,否则修改将无效。点击OK关闭。
  10. 运行这个小程序来验证你的设置:

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

    你的编译命令应该看起来像这样:

     g++ "-IC:gmpinclude" -O0 -g3 -Wall -c -fmessage-length=0 -lgmp -lgmpxx -o main.o "..main.cpp" g++ "-LC:gmplib" -o GMPDebug.exe main.o -lgmp -lgmpxx
    

指出:

  1. 选项的顺序很重要。我不知道所有的原因,但是如果第二个命令行(链接程序)在-o选项之前有-lgmp -lgmpxx标志,那么链接将失败。

  2. -l标志是一个棘手的。它实际上是说"在-L中查找library。a"在这种情况下,"去C:gmplib中查找libgmp。"a and libgmpxx.a".

  3. 我听说过涉及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;
}

编译:g++ -o gmp_pow_test gmp_pow_test.cpp -lgmp

Run: ./gmp_pow_test

在Ubuntu上安装gmp库:sudo apt-get install libgmp-dev libgmpxx4ldbl

你需要告诉编译器你想要使用哪些库。

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

可能已经太迟了,没有什么用了,但是…

首先,你的程序工作得很好。正如其他人指出的那样,您需要(a)确保安装了GMP库(包括其gmpxx扩展和所有相关文件),并且(b)您告诉编译器在哪里可以找到包含文件和要链接的库。在我的例子中,include文件在/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;
}
下面是编译/链接命令:

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

下面是调用gmpxx- test产生的结果:

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

你需要告诉编译器头文件在哪里

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

我尝试了很多解决方案,但都有一些问题

这是安装GMP和eclipse的最佳方法

点击此链接http://www.multigesture.net/articles/how-to-install-mingw-msys-and-eclipse-on-windows/

你需要确保以下内容没有被提及:

安装MinGW时,请选择不包含空格的路径,如"c:MinGW"

安装完成后,From start打开MinGW安装管理器

  • 选择所有的基础-然后在"MinGW"下选择要安装的所有GMP库
  • <
  • 申请更改/gh>

之后你将安装JDK,然后添加"C:Program FilesJavajdk1.8.0_121bin"PATH系统变量

安装Eclipse后进入:

  • GCC c++编译器——>在
  • 行末尾添加-lgmp -lgmpxx
  • MinGW c++链接器——>添加到"Libraries (-l)"gmp和gmpxx在该顺序

gooooo。