使用MSYS2在Windows编译GMP64位动态库

下载并安装MSYS2

MSYS2官网下载msys2-x86_64-20220603.exe,打开并直接完成安装。

如果官网太慢,可以在清华源下载msys2-x86_64-20220603.exe

我将它安装在了D:\msys64下。

安装完成后会自动打开一个窗口,不用管它。

接下来需要将D:\msys64\mingw64\bin这个目录添加到系统变量Path中,如图:

下载GMP库

GMP官网下载gmp-6.2.1.tar.xz,文件解压后存放在D:\msys64\home\admin\gmp-6.2.1中,其中admin是用户名。

正式安装

打开msys2根目录下的mingw64.exe,打开后窗口如下:

注意红框是MINGW64.

如果执行命令时下载速度太慢,可以先参考这里将镜像源改成优先使用清华源。也就是直接执行如下代码:

1
sed -i "s#mirror.msys2.org/#mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*
  1. 先更新软件源和软件
1
pacman -Syu
  1. 安装如下内容
1
2
3
4
5
6
7
8
pacman -S mingw-w64-x86_64-gcc
pacman -S mingw-w64-x86_64-make
pacman -S mingw-w64-x86_64-libtool
pacman -S autoconf
pacman -S automake
pacman -S mingw-w64-x86_64-python3
pacman -S make
pacman -S mingw-w64-x86_64-gdb
  1. 跳转到解压后的GMP库的根目录,并进行动态库编译。

这一部分的命令需要执行相当长的时间,电脑约运行了约\(6\)个小时。

\(2022\)\(11\)\(19\)日更新,在新电脑上编译用了不到半小时就完成了,取决于配置)

1
2
3
4
5
 cd gmp-6.2.1/
./configure --disable-static --enable-shared
make
make check
make install

执行完这些命令看到这个就可以了。

正式使用GMP库

如果直接使用命令行进行编译,那么编译命令需要添加多一个参数,如下:

1
g++ main.cpp -lgmp

CodeBlocks使用

在Codeblocks中的设置——编译器——全局编译器设置——可执行工具链切换成msys2中的MinGW,如图

然后再在连接器设置这里添加一个参数-lgmp即可。

Clion使用

同样也需要先在Clion切换成MSYS2中的MinGW,如图

如果发现这个红色警告Not Found,那么将\msys64\mingw64下的include 文件夹整个复制到\msys64\mingw64\x86_64-w64-mingw32下。

创建一个新的项目后,需要在CMakeLists.txt中添加如下代码。

1
target_link_libraries([Project-Name] D:\\\\msys64\\\\mingw64\\\\bin\\\\libgmp-10.dll)

其中[Project-Name]是项目的名称。

Vscode使用

新建一个文件夹,并且写好示例代码A.cpp

使用快捷键Ctrl+F5,显示该窗口后点击C++ (GDB/LLDB),并点击安装好的MSYS2g++.exe

运行后发现报错。打开/.vscode/task.json,在这个地方添加编译参数-lgmp

再一次使用Ctrl+F5运行即可。

示例代码执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# include <gmpxx.h>
int main(){
mpz_t a,b;
mpz_init_set_str(a,"1000000007",10);
printf("1000000007 is prime? %d\n",mpz_probab_prime_p(a,50) > 0);
mpz_set_str(a,"10000000007",10);
printf("10000000007 is prime? %d\n",mpz_probab_prime_p(a,50) > 0);
int n=199,m=200;
//计算并输出199!和200!,199!+200!。
mpz_set_si(a,1);
mpz_init_set_si(b,1);
for(int i=1;i<=n;i++)
mpz_mul_si(a,a,i);
for(int i=1;i<=m;i++)
mpz_mul_si(b,b,i);
gmp_printf("%d!= %Zd\n",n,a);
gmp_printf("%d!= %Zd\n",m,b);
mpz_add(a,a,b);
gmp_printf("199!+200!= %Zd\n",a);
}
  1. 直接使用命令行来编译

  1. CodeBlocks执行结果

  1. Clion执行结果

  1. Vscode运行结果

另附:GMP库的文档

相关参考:[1]