Windows下编译并使用64位GMP
1. 概述
GMP是一个开源的数学运算库,它可以用于任意精度的数学运算,包括有符号整数、有理数和浮点数,是进行大数运算比较好的选择。
需要说明的是,在Windows环境下编译GMP库不是很容易的一件事情,如果可以的话,还是找一下已经编译好的库文件直接调用。GMP是C语言编写的库,在接口方面是比较稳定的,理论上是甚至能够做到跨语言调用。
2. 编译
2.1. GCC环境
GMP库只提供了一个Makefile文件,这意味着需要GCC环境的支持。在Windows下使用GCC就需要MinGW了,但是MinGW是支持32位编译的,如果要编译64位的话,就得使用MinGW-w64了。MinGW-w64是MinGW的升级版本(MinGW已经不更新了),能够编译64位和32位。但是,没错还有但是只有MinGW-w64是没办法编译Makefile文件的,单独的MinGW-w64环境只能自己一个个编译链接源代码。编译Makefile文件需要安装msys2,msys2可以在Windows下搭建一个类linux环境,里面不仅集成了MinGW-w64,还可以包括bash、vim、gcc、make等工具包。
所以知道这里面有多绕了吧?要编译GMP只需要下载msys2就行了,当初我可是把MinGW、MinGW-w64都下载尝试了一遍。当然使用msys2也是有坑的,msys2的工具包需要在线下载,地址在国外的工具包下载很慢,这个时候就需要更换国内数据源才行。其中的具体的安装过程可以参考文章结尾出的文献[1],记得一定要安装gcc和make。
2.2. 编译过程
在msys2中配置好gcc和make工具包之后,启动工作目录下的msys2环境。在msys2安装目录下有msys2.exe和mingw64.exe两个启动入口,可以都试试,看是否支持make指令,理论上两者都是可以使用的:

启动msys2环境后,通过CD命令进入到GMP的源代码目录,依次输入如下指令:
./configure
make
make install
就可以编译出静态包,如果需要动态库,那么可以把第一条指令修改为:
./configure --disable-static --enable-shared
这里建议使用动态库。
3. 使用
3.1. 调用
另外一个头痛的问题就是mingw编译出来的静态库后缀名为.a,编译出来的动态库的导入库后缀名为.dll.a,而在Windows下一般使用.lib的来作为静态库或者动态库的导入库。好在VS中是能够识别.a文件作为导入库的,像加载.lib一样加载dll.a即可:
#pragma comment(lib, "libgmp.dll.a")
注意使用动态库时,单独运行时可能会提示缺少dll,libgmp.dll还依赖了mingw中的一些运行时库,根据提示找到相应的dll即可。
3.2. 示例
在VS环境中设置好动态库环境,使用实例代码如下:
#include <iostream>
#include "gmp.h"
using namespace std;
int main()
{
//计算2的1000次方
{
size_t a = 1;
for (int i = 0; i < 1000; i++)
{
a *= 2;
}
cout << "2^1000 = " << a << endl;
}
{
mpz_t a, b, c, d;
mpz_init(a);
mpz_init(b);
mpz_init(c);
mpz_init(d);
//计算2的1000次方
mpz_init_set_ui(a, 2);
mpz_pow_ui(c, a, 1000);
gmp_printf("c = %Zd\n", c);
}
//大数运算
{
mpz_t b, c, d;
mpz_init(b);
mpz_init(c);
mpz_init(d);
//计算12345678900987654321*98765432100123456789
mpz_init_set_str(b, "12345678900987654321", 10);//10进制
mpz_init_set_str(c, "98765432100123456789", 10);
mpz_mul(d, b, c);
gmp_printf("d = %Zd\n", d);
mpz_clear(b);
mpz_clear(c);
mpz_clear(d);
}
return 0;
}
以上演示了使用大数幂运算和乘法运算的过程,运行结果如下:

最后附上我编译的GMP地址。
4. 参考
- windows搭建gcc开发环境(msys2)
- C/C++编译器gcc的windows版本MinGW-w64安装教程
- 如何在windows下编译GMP软件包
- 如何在vc中使用mingw编译出来的动态库和静态库
Windows下编译并使用64位GMP的更多相关文章
- Windows下python2.7安装64位mysqlclient
在使用python调用mysql数据库的时候,需要引入对应的数据包 import MySQLdb 如果提示找不到对应的包,说明还需要安装对应的mysql数据库客户端操作的python包.在python ...
- windows 下编译64位ffmpeg
window下如何编译ffmpeg 前文已有介绍,前面介绍的都是如何编译32位的库,本文主要介绍window 下如何编译64位ffmpeg库. 一.搭建编译环境 1.下载 windows下编译64位F ...
- [转] Windows下编译OpenSSL
简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...
- windows下编译php7图形库php_ui.dll
CSDN博客 具有图形化编程才有意思,这几天看到了php ui 图形扩展,只是现在只能下载php 7.1的 本次教程编译php7.2.6的 php ui 要是linux下编译起来比较简单 但是 win ...
- windows下编译和安装boost库
boost是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库. 获取方式 boost提供源码形式的安装包,可以从boost官方网站下载,目前最新版本是1.59.0. 本机上正好有boos ...
- Windows下编译memcached-1.4.5(32bit和64bit)
1.简介 Memcached 是一个高性能的分布式内存对象缓存系统.它通过将数据缓存在内存中来减少对数据库和文件系统的访问,减轻数据库及操作系统的负担,提高应用系统的速度. 目前已经很多系统应用了me ...
- 在Windows下编译mongo-c-driver 1.3.x
在Windows下编译mongo-c-driver 1.3.x 在Windows下编译mongo-c-driver 1.3.x 1.安装 MSYS2https://sourceforge.net/pr ...
- Windows下编译YouCompleteMe流程
废话 生命在于折腾. 之前不用这个插件的原因: 因为要使这个插件起作用,前前后后需要下载几百MB(win下更是超过了1GB)的东西,包括了Clang编译器,ycmd的c艹源码还有ycm本身的vim s ...
- ffmpeg windows下编译ffmpeg
windows下编译ffmpeg 今天由于工作需求需重新编译ffmpeg,百度,goole了一大堆,看眼花缭乱的,但几乎都是三种方案,大部分都是直接转发,一字不漏,错误的缺文件的还是照转,可是问题都大 ...
- Windows下编译OpenSSL(使用VS2013)
简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...
随机推荐
- 基于Effect的组件设计
Effect的概念起源 从输入输出的角度理解Effect https://link.excalidraw.com/p/readonly/KXAy7d2DlnkM8X1yps6L 编程中的Effect起 ...
- MyBatis foreach循环批量修改数据时报错
报错如下 org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: java.sql.S ...
- JNI编程之字符串处理
java中的字符串类型是String,对应的jni类型是jstring,由于jstring是引用类型,所以我们不能像基本数据类型那样去使用它,我们需要使用JNIEnv中的函数去处理jstring,下面 ...
- 算法修养--A*寻路算法
A*寻路算法 广度优先算法 广度优先算法搜索以广度做未优先级进行搜索. 从起点开始,首先遍历起点周围邻近的点,然后再遍历已经遍历过的点邻近的点,逐步的向外扩散,直到找到终点. 这种算法就像洪水(Flo ...
- 03-11gR2单机通过RMAN恢复到RAC(未验证)
1.在单机上做一个完全备份,并将备份集拷贝到RAC的第一个节点上. 2.强行启动到nomount 3.恢复spfile 4.创建pfile,修改pfile,重建spfile #####修改contro ...
- getc()、getchar()、getch() 和 getche() 的区别
所有这些函数都从输入中读取一个字符并返回一个整数值.返回整数以容纳用于指示失败的特殊值.EOF值通常用于此目的. getc() 它从给定的输入流中读取单个字符,并在成功时返回相应的整数值(通常 ...
- js闭包使用之处
1.循环绑定 No Use: var lists = document.getElementsByTagName('li'); for(var i=0;i<lists.length;i& ...
- [C++]线段树 区间查询 单点修改
线段树 区间查询 单点修改 算法思想 这个算法是用于数组的查询和修改 可以高效的进行查询修改 但是会增加内存的使用 本质上是一种 空间换时间 的算法 这个算法把一串数组无限二分 直到分的只剩下一个数据 ...
- 国产瀚高数据库简单实践 及 authentication method 13 not supported 错误解决方法
近几年IT界软硬件"国产化"搞得很密集,给很多公司带来了商机.但是有些公司拿国外的代码改改换个皮肤,就是"自主知识产权"的国产软件,光明正大卖钱,这个有点... ...
- shell 语法介绍
大家好,我是蓝胖子,在日常开发中或多或少都会接触到shell脚本,可以说会shell脚本是一位后端开发的基本功,今天我将会花上一篇文章总结下常见的shell的语法,学完本篇,相信简单的shell脚本就 ...