18

我已经使用该网站上的说明安装了 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;
}

但是如果我使用以下命令编译它:g++ test.cpp -o test.exe,它会显示 gmpxx.h: no such file or directory。我怎样才能解决这个问题?我对此有点陌生。我正在使用 MinGW。

4

7 回答 7

18

在此处获取实际版本GNU GMP Library。确保将其配置为安装在 /usr/lib 中(通过 --prefix=/usr 进行配置)。

这里有文档:GNU GMP 手册

您没有正确使用该库。我不知道您是否可以使用 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;
}

编译:

g++ -lgmp file.cpp -o file
于 2013-01-02T18:10:44.633 回答
8

这是使用 Eclipse CDT、MinGW 和 msys for C++ 设置当前(截至 2013 年 7 月 2 日)GNU bignum 库的正确过程。要搞定这个,你应该以前用过Unix或Linux,还有Windows,你应该对编程和编译程序有一个模糊的回忆。这是一个多星期的研究和顽固挫折的高潮,所以如果我把事情搞砸了,请礼貌地记下,否则我会用我的思想把你炸死!

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

  2. 将 GMP 库的压缩包从 gmplib.org 下载到 ${gmp_download}。我下载了 gmp-5.1.2.tar.xz,因为我从来没有使用过 lzip,也不知道它是否在 msys 中可用。

  3. 打开一个 msys 窗口(本质上是一个 bash shell)。cd ${gmp_buid} 和 tar -Jxvf ${gmp_download}/gmp-xxxtar.xz

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

  4. cd gmp-xxx 并运行 ./config.guess。写下输出。接下来你将需要它。

  5. 运行 ./configure --prefix=${gmp_build} --build= --enable-cxx --with-gnu-ld

    显然,如果您没有明确告诉 GMP 为您的平台构建,它会构建所有内容,这很糟糕。cxx 选项构建 C++ 库,并且 --with-gnu-ld 允许它与 ld 一起使用。很简单。

  6. 制作

  7. 进行安装

    例如:假设您安装到 C:/gmp。你应该有 gmp/include/gmp.h 和 gmpxx.h。您还应该有 gmp/lib/libgmp.a、libgmp.la、libgmpxx.a、libgmpxx.la。您还应该有一个包含内容的共享目录。

  8. 设置日食:

    • 转到项目-> 属性
    • 在 C/C++ build --> Environment 下编辑 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 到该行的 END。线的尽头!
    • 相同的地方 --> GCC C 编译器添加与以前相同的包含路径和其他选项。
    • 相同的地方 --> MinGW C++ 链接器 --> 库 按该顺序将 gmp 和 gmpxx 添加到“库 (-l)”!现在将 ${gmp_build}/lib 添加到“库搜索路径 (-L)”
    • 在 C/C++ General --> Paths & Symbols --> Incudes 选项卡下,检查您的包含目录中是否有 ${gmp_build}/include 用于 Assembly、C 和 C++。如果他们不在那里,您可能已经搞砸了之前的步骤。它们应该由 Eclipse 自动填充。
    • 相同的地方 --> 库选项卡检查你是否有 gmp 和 gmpxx 在那个顺序。它应该已经被填充。
    • 相同的地方 --> 库路径选项卡检查应该已经存在的 ${gmp_build}/lib。点击“应用”并确保重建索引,否则更改将不会进行。点击确定关闭。
  9. 运行这个简短的程序来验证您的设置:

    #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:\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
    

笔记:

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

  2. -l 标志是一个棘手的标志。它实际上是说“在 -L 中查找 liblibrary.a”。在这种情况下,“在 C:\gmp\lib 中查找 libgmp.a 和 libgmpxx.a”。

  3. 我听说过涉及 cout 和 64 位版本的 eclipse 的错误,所以我使用的是 32 位版本,在那里我看到了同样的错误。:-)

于 2013-07-03T03:11:16.473 回答
7

由于 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

跑 :./gmp_pow_test

使用以下命令在 Ubuntu 上安装 gmp 库:sudo apt-get install libgmp-dev libgmpxx4ldbl

于 2014-12-10T07:07:07.837 回答
5

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

g++ -lgmp -lgmpxx file.cpp -o file
于 2013-04-19T09:01:18.327 回答
5

可能为时已晚,没有用,但是...

首先,您的程序运行良好。正如其他人指出的那样,您需要 (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;
}

这是编译/链接命令:

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

以下是 gmpxx-tst 的调用产生的结果:

$ ./gmpxx-tst
sum of 1234 and -5678 is -4444
absolute value is 4444 
$
于 2014-03-10T02:46:00.977 回答
3

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

g++ test.cpp -I/path/to/directory/that/contains/the/header -o test.exe
于 2013-01-02T17:29:20.993 回答
0

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

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

按照这个链接 http://www.multigesture.net/articles/how-to-install-mingw-msys-and-eclipse-on-windows/

您需要确保其中未提及的以下内容:

安装 MinGW 时选择不包含空格的路径,如“c:\MinGW”

安装后,从开始打开​​MinGW 安装管理器

  • 选择所有基础 - 然后在 MinGW 下,选择要安装的所有 GMP 库
  • 应用更改

之后,您将安装 JDK,然后将“C:\Program Files\Java\jdk1.8.0_121\bin”添加到 PATH 系统变量

安装 Eclipse 后转到:

  • GCC C++ 编译器 --> Miscellaneous 添加 -lgmp -lgmpxx 到该行的 END
  • MinGW C++ 链接器 --> 库 按该顺序将 gmp 和 gmpxx 添加到“库 (-l)”

前进。

于 2020-11-19T21:15:22.503 回答