使用GMP库的c ++程序

时间:2013-01-02 17:27:04

标签: c++ gmp

我已使用本网站上的说明安装了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:没有这样的文件或目录。 我怎样才能解决这个问题?我对此很陌生。我正在使用MinGW。

7 个答案:

答案 0 :(得分:15)

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

这里有文档:GNU GMP Manual

您没有正确使用lib。我不知道你是否可以直接访问mpx值 使用C ++函数,但是,这里有一个你想要实现的实例:

#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

答案 1 :(得分:6)

这是使用Eclipse CDT,MinGW和msys for C ++设置当前(截至7月2日)GNU bignum库的正确过程。为了解决这个问题,您之前应该使用Unix或Linux,以及Windows,您应该对编程和编译程序有一个模糊的回忆。这是一个多星期的研究和铁杆挫败感的高潮,所以如果我搞砸了一些东西,请用礼貌的方式记下它,否则我会用我的力量打击你!

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

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

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

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

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

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

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

  6. make install

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

  7. 设置eclipse:

    • 转到项目 - &gt;物业
    • 在C / C ++构建下 - &gt;环境编辑PATH变量并添加$ {gmp_build} / include; $ {gmp_build} / lib
    • 在C / C ++构建下 - &gt;设置 - &gt;工具设置 - &gt; GCC汇编程序 - &gt;一般将$ {gmp_build} / include添加为包含路径。
    • 同一个地方但是 - &gt; GCC C ++编译器 - &gt;包括添加$ {gmp_build} / include作为包含路径。
    • 同一个地方 - &gt; GCC C ++编译器 - &gt;杂项将-lgmp -lgmpxx添加到行的END。线路终点!
    • 同一个地方 - &gt; GCC C编译器像以前一样添加相同的包含路径和其他选项。
    • 同一个地方 - &gt; MinGW C ++链接器 - &gt;库添加到“库(-l)”gmp和gmpxx这个订单!现在将$ {gmp_build} / lib添加到“LIbrary Search Path(-L)”
    • 在C / C ++ General下 - &gt;路径&amp;符号 - &gt; Incudes选项卡检查您在Assembly,C和C ++的include目录中是否有$ {gmp_build} / include。如果他们不在那里你可能搞砸了早先的一步。它们应该由Eclipse自动填充。
    • 同一个地方 - &gt; Libraries选项卡检查你有gmp和gmpxx IN THAT ORDER。它应该已经填充。
    • 同一地点 - &gt;库路径选项卡检查应该已存在的$ {gmp_build} / lib。 点击“应用”并确保重建索引或更改不会。点击“确定”关闭。
  8. 运行此简短程序以验证您的设置:

    #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
    
  9. 注意:

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

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

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

答案 2 :(得分:4)

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

编译:{{1​​}}

运行:g++ -o gmp_pow_test gmp_pow_test.cpp -lgmp

在Ubuntu上安装gmp库,其中包括:./gmp_pow_test

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

您需要告诉编译器 头文件是什么。

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

答案 5 :(得分:2)

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

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

这是compile / link命令:

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 
$

答案 6 :(得分: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 ++编译器->其他将-lgmp -lgmpxx添加到该行的结尾
  • MinGW C ++链接器->库按顺序将gmp和gmpxx都添加到“库(-l)”中

再见。