繁体   English   中英

使用GMP库的c++程序

[英]c++ program using GMP library

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

在此处获取GNU GMP 库的实际版本。 确保将其配置为安装在 /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

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

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

  2. 将 GMP 库的 tarball 从 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++ 构建 --> 设置 --> 工具设置 --> GCC 汇编器 --> 一般添加 ${gmp_build}/include 作为包含路径。
    • 相同的地方,但 --> GCC C++ 编译器 --> 包含添加 ${gmp_build}/include 作为包含路径。
    • 相同的地方 --> GCC C++ 编译器 --> 杂项将 -lgmp -lgmpxx 添加到行尾。 这条线的尽头!
    • 相同的地方 --> GCC C 编译器添加与以前相同的包含路径和杂项选项。
    • 相同的地方 --> MinGW C++ 链接器 --> 库 按该顺序将 gmp 和 gmpxx 添加到“库 (-l)”中! 现在将 ${gmp_build}/lib 添加到“图书馆搜索路径 (-L)”
    • 在 C/C++ General --> Paths & Symbols --> Incudes Tab 下检查您的包含目录中是否有 ${gmp_build}/include 用于汇编、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 位版本,在那里我看到了相同的错误。 :-)

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

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

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

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

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

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

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

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”

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

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

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

安装 Eclipse 后转到:

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

哇哦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM