使用GMP库的c ++程序

Bad*_*hah 14 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;
}
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)

  • 您的代码使用的是C API,而不是C++ API.您提供的库的链接已过时(旧版GMP). (5认同)

cas*_*ius 7

以下是使用Eclipse CDT,MinGW和msys for C++设置当前(截至7/2/13)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-xxxtar.xz

    这些焦油选项与您在网络上的其他地方不同!-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. make install

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

  8. 设置eclipse:

    • 转到项目 - >属性
    • 在C/C++ build - > Environment下编辑PATH变量并添加$ {gmp_build}/include; $ {gmp_build}/lib
    • 在C/C++构建 - >设置 - >工具设置 - > GCC汇编程序 - >一般添加$ {gmp_build}/include作为包含路径.
    • 相同的地方,但是 - > GCC C++编译器 - >包括添加$ {gmp_build}/include作为包含路径.
    • 相同位置 - > GCC C++编译器 - >其他将-lgmp -lgmpxx添加到行的END.线的终点!
    • 相同位置 - > GCC C编译器像以前一样添加相同的包含路径和其他选项.
    • 相同的地方 - > MinGW C++链接器 - >库添加到"库(-l)"gmp和gmpxx这个订单!现在将$ {gmp_build}/lib添加到"LIbrary Search Path(-L)"
    • 在C/C++下 - >路径和符号 - > Incudes选项卡检查您在Assembly,C和C++的include目录中是否有$ {gmp_build}/include.如果他们不在那里你可能搞砸了早期的一步.它们应该由Eclipse自动填充.
    • 同一个地方 - > Libraries选项卡检查你有gmp和gmpxx IN THAT ORDER.它应该已经填充.
    • 相同位置 - >库路径选项卡检查$ {gmp_build}/lib应该已经存在.点击"应用"并确保重建索引或更改不会.点击OK关闭.
  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;
    }
    
    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)

笔记:

  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.:-)


Piy*_*han 6

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

  • 如果要编写C代码,则最好只包含gmp.h并使用C编译器进行编译,而无需链接gmpxx。另外,mpz_pow_ui看起来也不是计算2的幂的有效方法。 (3认同)

小智 5

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

g++ -lgmp -lgmpxx file.cpp -o file
Run Code Online (Sandbox Code Playgroud)


Mou*_*use 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;
}
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)