【问题标题】:How to install GMP Mp on windows? (C++)如何在 Windows 上安装 GMP Mp? (C++)
【发布时间】:2023-03-27 20:17:02
【问题描述】:

我已经按照我可能找到的每一个指南进行操作,但老实说,我什至不知道某些安装“步骤”是什么意思。

我尝试安装 Cygwin(和 MYSY)并运行指南告诉我的命令,但终端要么不执行任何操作,要么给我错误:“没有这样的文件或目录”。 (我将文件夹目录更改为我的文件所在的位置)

我也不能完全确定我是否正确安装了所有东西,因为我应该在安装过程中检查一些附加组件,对吧?我按照指南做了,但我仍然可能错过了一些东西......

考虑到这是我第一次做这样的事情,我不知道@987654323 @ , make 和所有其他命令甚至意味着......

【问题讨论】:

  • 你在做 C++ 时通常的环境是什么(IDE?编译器?)?
  • 请注意,您没有告诉我们您在做什么以及问题出在哪里。 Cygwin 安装程序默认安装一组最小的基本程序;编译器、make 和其他工具必须特别需要。 GMP 包已经在 cygwin 中可用:libgmp-devellibgmpxx4libgmp10
  • @matzeri 基本上我需要 gmp 对我正在编写的程序的整数具有任意精度,我完成了以下视频的所有步骤:youtube.com/watch?v=osr1x5F3fmI 但最后当我转到“项目”->“项目选项”->“参数”->“链接器”,我搜索“libgmpxx.a”和“libgmp.a”,它们不存在并且#include 和#include 会导致一个错误(因为显然库不存在),正如我所说,其他方法对我没有任何帮助,我在 cygwin 或 MYSY 中编写的每个命令要么没有响应,要么没有响应错误
  • "libgmpxx.a" 和 "libgmp.a" 是静态库。 Cygwin 使用共享的,所以 libgmp-devel 包含 .dll.a 版本。 cygwin.com/packages/x86_64/libgmp-devel/libgmp-devel-6.1.2-1。 PS:every command告诉我什么给我们一些例子,我们可以指导你。
  • 我以为 msys2 有预建的 GMP 包...

标签: c++ makefile cygwin autotools gmp


【解决方案1】:

以下是仅使用 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

完成安装后,验证我们是否已正确安装:

$ 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 to 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,第一个在包中:

$ 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

【讨论】:

  • 在“示例”之前一切正常,“$ 文件 mpz_add.cpp”,一旦我在 cygwin 中写入,我得到:“mpz_add.cpp:无法打开“mpz_add.cpp”(没有这样的文件或目录)',我对编辑器一无所知......我真的很困惑!我必须单独“安装” mpz_add.cpp 吗?
  • 您需要编写它,您是否希望该文件会神奇地出现在您的PC上?将$cat.. 行之后的文本复制并粘贴到文本文件中,并另存为mpz_add.cpp。任何文本编辑器都可以:记事本(包含在 Windows 中)、记事本++、...(谷歌给了我这个列表 lifewire.com/best-free-text-editors-4155819)。我使用 Vim,但它可能与您的专有技术基础差异太大
  • 这一切对我来说有点像魔术!无论如何,更严肃的一点是,我在记事本上写了该代码,按照您告诉我的方式保存,但我仍然遇到同样的错误,它创建了文件,我必须将它放在特定目录中吗?另外,一旦我想编写一个程序,我就不能进入 c++ 并只写 '#include ' 来拥有库吗?或者我需要将它写在一个文本文件上并以不同的方式编译它? (很抱歉问了这么多问题,只是,我第一次做这样的事情,网上论坛真的很混乱)
  • 你可以把它放在你的 Mintty shell 打开的地方(通常是C:\cygwin\home\your_user),或者你可以改变你放置文件的工作目录。 C++ 是一门语言,不要将它与您安装的Dev-C++ 开发环境混淆。
  • 好的,这个例子成功了!所以,让我试着弄清楚我现在应该做什么,我写我的程序,比如说,在 Dev-C++ 中,然后我只是复制整个代码,将它粘贴到一个文本文件中,用某个名称保存它,比如说'prog.cpp',把它放在我的目录中,进入cygwin并执行'$ g++ prog.cpp -lgmpxx -lgmp -o prog',然后运行它我写'$ ./prog',是吗以这种方式工作?