如何在Windows上安装GMP Mp?(C++)

3
我已经按照所有能找到的指南进行了尝试,但老实说我甚至不知道某些安装步骤是什么意思。
我试着安装了Cygwin(和MYSY)并运行了指南中告诉我的命令,但终端要么什么都不做,要么给出错误:“没有这个文件或目录”。(我把文件夹目录改到了我的文件所在的位置)
而且我也不确定自己是否已正确地安装了所有内容,因为在安装过程中我应该检查一些插件对吧?虽然我按照指南操作了,但仍然可能漏掉了一些东西......
请有人详细地一步一步地解释说明如何进行安装(我正在运行Windows 7),明确说明需要做什么,因为这是我第一次尝试这样的事情,我不知道“./configure”、“make”和其他所有命令的含义......

1
你在进行C++编程时通常使用什么环境(IDE?编译器?)? - Swordfish
请注意,您并没有告诉我们您正在做什么以及问题出在哪里。Cygwin安装程序默认安装了一组最基本的程序;编译器、make和其他工具必须明确要求安装。GMP软件包已经在Cygwin中可用:libgmp-devellibgmpxx4libgmp10 - matzeri
@matzeri 基本上我需要gmp来对整数进行任意精度计算,以便于我正在编写的程序。我按照以下视频的所有步骤进行操作:https://www.youtube.com/watch?v=osr1x5F3fmI 但是,在最后当我进入“项目”->“项目选项”->“参数”->“链接器”,并搜索“libgmpxx.a”和“libgmp.a”时,它们不在那里。#include <gmp.h> 和 #include <gmpxx.h> 导致错误(因为显然库不存在)。话虽如此,其他方法对我没有任何帮助,正如我所说,我在cygwin或MYSY中输入的每个命令都要么没有响应,要么出现一个错误。 - Spasoje Durovic
"libgmpxx.a"和"libgmp.a"是静态库。Cygwin使用共享库,因此“libgmp-devel”包含.dll.a版本。https://cygwin.com/packages/x86_64/libgmp-devel/libgmp-devel-6.1.2-1。附:仅告诉我们“每个命令”不能为您提供任何信息,请提供一些示例,我们可以给您指引。 - matzeri
我认为msys2有预构建的GMP软件包... - Marc Glisse
真的没有发布的静态库可以直接插入和使用吗?难道必须安装各种构建工具并进行各种杂技才能获得C++库吗?那些不使用cygwin、msys或mingw的人怎么办?GMP是否依赖于mingw的特定功能,还是也可以与Microsoft编译器一起使用? - mireazma
1个回答

3
以下是仅使用cygwin工具的简单逐步操作。
为了编译C++,我们需要g++编译器;为了定位正确的安装包,可以使用cygwin工具中默认安装的cygcheck(通过-p开关),它会查询https://cygwin.com/packages/上的数据库:
$ cygcheck -p bin/g++
Found 3 matches for bin/g++
gcc-g++-7.3.0-1 - gcc-g++: GNU Compiler Collection (C++)
gcc-g++-7.3.0-2 - gcc-g++: GNU Compiler Collection (C++)
gcc-g++-7.3.0-3 - gcc-g++: GNU Compiler Collection (C++)

所以我们需要安装gcc-g++包。
要安装它,我们运行cygwin安装程序,选择Full视图,搜索gcc-g以过滤成千上万的软件包,并在gcc-g++行上点击skip

enter image description here

完成安装后,为了验证我们已正确安装:
$ cygcheck -c gcc-g++
Cygwin Package Information
Package              Version        Status
gcc-g++              7.3.0-3        OK

安装gcc-g++也会安装C编译器包gcc-core。
要编译gmp程序,我们需要正确的头文件和共享库;通常包含在“*-devel”包中。
$ cygcheck -p include/gmpxx.h
Found 9 matches for include/gmpxx.h
libgmp-devel-6.1.0-3p1 - libgmp-devel: Library for arbitrary precision arithmetic (development) (installed binaries and support files)
libgmp-devel-6.1.1-1 - libgmp-devel: Library for arbitrary precision arithmetic (development) (installed binaries and support files)
libgmp-devel-6.1.2-1 - libgmp-devel: Library for arbitrary precision arithmetic (development)
mingw64-i686-gmp-6.0.0a-2 - mingw64-i686-gmp: Multiple Precision arithmetic library for Win32 toolchain (installed binaries and support files)
...

所有带有mingw64的软件包都是用于交叉编译的,我们可以忽略它们,因此需要安装的是libgmp-devel。请确认其已正确安装。
$ cygcheck -c libgmp-devel
Cygwin Package Information
Package              Version        Status
libgmp-devel         6.1.2-1        OK

而包内容则包括头文件和导入库

$ cygcheck -l libgmp-devel
/usr/include/gmp.h
/usr/include/gmpxx.h
/usr/lib/libgmp.dll.a
/usr/lib/libgmpxx.dll.a

现在我们可以编写一个例子,我从https://gmplib.org/manual/C_002b_002b-Interface-General.html中获取它,并将其写入名为mpz_add.cpp的文件中。您可以使用任何编辑器。重要的是该文件遵循Unix行终止标准LF,而不是Windows CR + LF(如果不是,请参见下面的说明)。
$ file mpz_add.cpp
mpz_add.cpp: C++ source, ASCII text

$ cat mpz_add.cpp
#include <gmpxx.h>
#include <iostream>
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";

  return 0;
}

编译我们的示例并进行测试:
$ g++ mpz_add.cpp -lgmpxx -lgmp -o  mpz_add
$ ./mpz_add
sum is -4444
absolute value is 4444

我们还可以验证程序中链接了哪些库,mpz_add函数中我添加了一些额外的注释:

$ cygcheck ./mpz_add
D:\cyg_pub\tmp\gmp\mpz_add.exe
  D:\cygwin64\bin\cygwin1.dll              <= cygwin library
    C:\WINDOWS\system32\KERNEL32.dll       <= windows system library
      C:\WINDOWS\system32\ntdll.dll         ...
      C:\WINDOWS\system32\KERNELBASE.dll    ...
  D:\cygwin64\bin\cyggmp-10.dll            <= GMP C library
  D:\cygwin64\bin\cyggmpxx-4.dll           <= GMP C++ library  
    D:\cygwin64\bin\cyggcc_s-seh-1.dll     <= C library
    D:\cygwin64\bin\cygstdc++-6.dll        <= C++ library

如果文件的行终止符不正确,最好的工具是 d2u(Dos 转 Unix)。
$ cygcheck -p bin/d2u
Found 6 matches for bin/d2u
...
dos2unix-7.4.0-1 - dos2unix: Line Break Conversion

$ file mpz_add.cpp
mpz_add.cpp: C++ source, ASCII text, with CRLF line terminators
$ d2u mpz_add.cpp
dos2unix: converting file mpz_add.cpp to Unix format...
$ file mpz_add.cpp
mpz_add.cpp: C++ source, ASCII text

由于您添加了makefileautotools标签,第一个标签包含在make软件包中。
$ cygcheck -p bin/make.exe
Found 6 matches for bin/make.exe
..
make-4.2.1-2 - make: The GNU version of the 'make' utility 

第二个步骤比较复杂,需要使用 autoconfautomakelibtool 这些包。

一切都很正常,直到出现了“示例”' $ file mpz_add.cpp',当我在cygwin中写入时,会出现以下错误:'mpz_add.cpp: 无法打开`mpz_add.cpp'(没有那个文件或目录)',我对编辑器一无所知...我真的很困惑!我需要单独“安装”mpz_add.cpp吗? - Spasoje Durovic
你需要亲自动手写代码,难道你期望文件会像魔法一样出现在你的电脑上吗?将$cat..行后面的文本复制并粘贴到一个文本文件中,然后将其保存为mpz_add.cpp。任何文本编辑器都可以使用:Notepad(包含在Windows中),Notepad++,...(谷歌给了我这个列表https://www.lifewire.com/best-free-text-editors-4155819)。我使用Vim,但它可能与你的知识背景有很大不同。 - matzeri
这一切对我来说都有点像魔法!无论如何,更严肃的是,我在记事本上编写了那段代码,按照你告诉我的方式保存了下来,但我仍然得到了相同的错误。它创建了文件,我需要将其放在特定的目录中吗?另外,当我想编写程序时,我不能直接进入C++并写“#include <gmpxx.h>”来使用库吗?还是我需要在文本文件中编写它,并以不同的方式进行编译?(很抱歉问这么多问题,这是我第一次做这样的事情,在线论坛真的很令人困惑) - Spasoje Durovic
你可以把它放在Mintty shell打开的位置(通常为C:\cygwin\home\your_user),或者你可以更改文件放置的工作目录。C++是一种语言,不要将其与你安装的Dev-C++开发环境混淆。 - matzeri
好的,这个例子成功了!那么现在让我试着理解一下接下来我应该做什么,我在 Dev-C++ 中编写我的程序,然后将整个代码复制粘贴到一个文本文件中,命名为“prog.cpp”,保存在我的目录中,进入 Cygwin 并执行 '$ g++ prog.cpp -lgmpxx -lgmp -o prog',然后想要运行它,我输入 '$ ./prog',是这样吗? - Spasoje Durovic
我假设 Dev-C++ 已经有一个文本编辑器,并且它可以直接生成文件,而无需使用另一个程序进行复制和粘贴。 - matzeri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接