1.1、安装
msys2 的主页地址:
http://www.msys2.org/
下载32位或64位,我这里 下载了64位
msys2-x86_64-20161025.exe
双击傻瓜式安装
1.2、更新软件包
开始菜单->MSYS2 64bit->MSYS2 MinGW 32-bit
剩下的工作都在这个bash shell下进行
查看软件包清单
$ pacman -Sl | grep gcc
mingw32 mingw-w64-i686-gcc 6.2.0-2 [已安装]
mingw32 mingw-w64-i686-gcc-ada 6.2.0-2
mingw32 mingw-w64-i686-gcc-fortran 6.2.0-2
mingw32 mingw-w64-i686-gcc-libgfortran 6.2.0-2 [已安装]
mingw32 mingw-w64-i686-gcc-libs 6.2.0-2 [已安装]
mingw32 mingw-w64-i686-gcc-objc 6.2.0-2
mingw64 mingw-w64-x86_64-gcc 6.2.0-2
mingw64 mingw-w64-x86_64-gcc-ada 6.2.0-2
mingw64 mingw-w64-x86_64-gcc-fortran 6.2.0-2
mingw64 mingw-w64-x86_64-gcc-libgfortran 6.2.0-2
mingw64 mingw-w64-x86_64-gcc-libs 6.2.0-2
mingw64 mingw-w64-x86_64-gcc-objc 6.2.0-2
msys gcc 5.3.0-3 [已安装]
msys gcc-fortran 5.3.0-3
msys gcc-libs 5.3.0-3 [已安装]
msys mingw-w64-cross-gcc 5.3.0-1
安装gcc
$ pacman -S mingw-w64-i686-gcc
警告:mingw-w64-i686-gcc-6.2.0-2 已经为最新 -- 重新安装
正在解决依赖关系...
正在查找软件包冲突...
软件包 (1) mingw-w64-i686-gcc-6.2.0-2
全部安装大小: 112.18 MiB
净更新大小: 0.00 MiB
:: 进行安装吗? [Y/n] Y
(1/1) 正在检查密钥环里的密钥 [#####################] 100%
(1/1) 正在检查软件包完整性 [#####################] 100%
(1/1) 正在加载软件包文件 [#####################] 100%
(1/1) 正在检查文件冲突 [#####################] 100%
(1/1) 正在检查可用硬盘空间 [#####################] 100%
:: 正在处理软件包的变化...
(1/1) 正在重新安装 mingw-w64-i686-gcc [#####################] 100%
查看gcc安装情况
$ gcc -v Using built-in specs. COLLECT_GCC=C:msys64mingw32ingcc.exe COLLECT_LTO_WRAPPER=C:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/6.2.0/lto-wrapper.exe Target: i686-w64-mingw32 Configured with: ../gcc-6.2.0/configure --prefix=/mingw32 --with-local-prefix=/mingw32/local --build=i686-w64-mingw32 --host=i686-w64-mingw32 --target=i686-w64-mingw32 --with-native-system-header-dir=/mingw32/i686-w64-mingw32/include --libexecdir=/mingw32/lib --enable-bootstrap --with-arch=i686 --with-tune=generic --enable-languages=c,lto,c++,objc,obj-c++,fortran,ada --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw32 --with-mpfr=/mingw32 --with-mpc=/mingw32 --with-isl=/mingw32 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld --disable-sjlj-exceptions --with-dwarf2 Thread model: posix gcc version 6.2.0 (Rev2, Built by MSYS2 project)
安装make
$ pacman -S make 警告:make-4.2.1-1 已经为最新 -- 重新安装 正在解决依赖关系... 正在查找软件包冲突... 软件包 (1) make-4.2.1-1 全部安装大小: 1.22 MiB 净更新大小: 0.00 MiB :: 进行安装吗? [Y/n] Y (1/1) 正在检查密钥环里的密钥 [#####################] 100% (1/1) 正在检查软件包完整性 [#####################] 100% (1/1) 正在加载软件包文件 [#####################] 100% (1/1) 正在检查文件冲突 [#####################] 100% (1/1) 正在检查可用硬盘空间 [#####################] 100% :: 正在处理软件包的变化... (1/1) 正在重新安装 make [#####################] 100%
查看make安装情况
$ make -v GNU Make 4.2.1 为 x86_64-pc-msys 编译 Copyright (C) 1988-2016 Free Software Foundation, Inc. 许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本<http://gnu.org/licenses/gpl.html>。 本软件是自由软件:您可以自由修改和重新发布它。 在法律允许的范围内没有其他保证。
2、编译GMP
2.1、下载gmp
https://gmplib.org/
Download the latest release of GMP GMP 6.1.2 lz, 1939430 bytes xz, 1946336 bytes bz2, 2386766 bytes Main site, gmplib.org, via https gmp-6.1.2.tar.lz gmp-6.1.2.tar.xz gmp-6.1.2.tar.bz2 USA, ftp.gnu.org, via https gmp-6.1.2.tar.lz gmp-6.1.2.tar.xz gmp-6.1.2.tar.bz2
我这里下载了gmp-6.1.2.tar.xz版本
2.2、进入bash shell
开始菜单->MSYS2 64bit->MSYS2 MinGW 32-bit
2.3、解压
进入到gmp-6.1.2.tar.xz目录
$ tar -xvf gmp-6.1.2.tar
2.4、编译
进入到gmp-6.1.2解压的目录
$ cd gmp-6.1.2/
configure
$ ./configure
make
2.5、生成的库文件位置
.libs 目录下
libgmp.a
3、VS使用
3.1、如何使用gmp
拷贝libgmp.a和gmp.h到工程目录下
#include <gmp.h> #pragma comment(lib, "libgmp.a") #pragma comment(lib, "libgcc.a")
这里需要把libgcc.a链接进来,位置在C:msys64mingw32libgcci686-w64-mingw326.2.0目录中
3.2、示例,生成两个素数p,q
#include "stdafx.h" #include <gmp.h> #pragma comment(lib, "libgmp.a") #pragma comment(lib, "libgcc.a") int _tmain(int argc, _TCHAR* argv[]) { gmp_randstate_t grt; gmp_randinit_default(grt); //设置随机数生成算法为默认 gmp_randseed_ui(grt, time(NULL)); //设置随机化种子为当前时间,这几条语句的作用相当于标准C中的srand(time(NULL)); mpz_t key_p, key_q; mpz_init(key_p); mpz_init(key_q); //一个mpz_t类型的变量必须在初始化后才能被使用 mpz_urandomb(key_p, grt, 1024); mpz_urandomb(key_q, grt, 1024); //随机生成一个在0~2^1024-1之间的随机数 if(mpz_even_p(key_p)) mpz_add_ui(key_p, key_p, 1); if(mpz_even_p(key_q)) mpz_add_ui(key_q, key_q, 1); //如果生成的随机数为偶数,则加一 while(!mpz_probab_prime_p(key_p, 25) > 0) //逐个检查比p大的奇数是否为素数 mpz_add_ui(key_p, key_p, 2); while(!mpz_probab_prime_p(key_q, 25) > 0) mpz_add_ui(key_q, key_q, 2); gmp_printf("%ZX ", key_p); //以十六进制的形式输出生成的素数 gmp_printf("%ZX ", key_q); return 0; }