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. 参考

  1. windows搭建gcc开发环境(msys2)
  2. C/C++编译器gcc的windows版本MinGW-w64安装教程
  3. 如何在windows下编译GMP软件包
  4. 如何在vc中使用mingw编译出来的动态库和静态库

Windows下编译并使用64位GMP的更多相关文章

  1. Windows下python2.7安装64位mysqlclient

    在使用python调用mysql数据库的时候,需要引入对应的数据包 import MySQLdb 如果提示找不到对应的包,说明还需要安装对应的mysql数据库客户端操作的python包.在python ...

  2. windows 下编译64位ffmpeg

    window下如何编译ffmpeg 前文已有介绍,前面介绍的都是如何编译32位的库,本文主要介绍window 下如何编译64位ffmpeg库. 一.搭建编译环境 1.下载 windows下编译64位F ...

  3. [转] Windows下编译OpenSSL

    简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...

  4. windows下编译php7图形库php_ui.dll

    CSDN博客 具有图形化编程才有意思,这几天看到了php ui 图形扩展,只是现在只能下载php 7.1的 本次教程编译php7.2.6的 php ui 要是linux下编译起来比较简单 但是 win ...

  5. windows下编译和安装boost库

    boost是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库. 获取方式 boost提供源码形式的安装包,可以从boost官方网站下载,目前最新版本是1.59.0. 本机上正好有boos ...

  6. Windows下编译memcached-1.4.5(32bit和64bit)

    1.简介 Memcached 是一个高性能的分布式内存对象缓存系统.它通过将数据缓存在内存中来减少对数据库和文件系统的访问,减轻数据库及操作系统的负担,提高应用系统的速度. 目前已经很多系统应用了me ...

  7. 在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 ...

  8. Windows下编译YouCompleteMe流程

    废话 生命在于折腾. 之前不用这个插件的原因: 因为要使这个插件起作用,前前后后需要下载几百MB(win下更是超过了1GB)的东西,包括了Clang编译器,ycmd的c艹源码还有ycm本身的vim s ...

  9. ffmpeg windows下编译ffmpeg

    windows下编译ffmpeg 今天由于工作需求需重新编译ffmpeg,百度,goole了一大堆,看眼花缭乱的,但几乎都是三种方案,大部分都是直接转发,一字不漏,错误的缺文件的还是照转,可是问题都大 ...

  10. Windows下编译OpenSSL(使用VS2013)

    简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...

随机推荐

  1. AI在人才测评领域的应用情况概述

    目录 收起 一.AI技术的通俗理解 二.AI在人才测评领域的应用情况概述 三.AI在构建人才标准上的应用 1.人才标准构建 2.人才画像 3.人岗智能匹配 四.AI在人才测评实施方面的应用 1.AI面 ...

  2. MySQL PXC 集群运维指南

    目录 一.PXC方案概述 二.PXC基础知识 三.PXC节点的配置安装 四.PXC节点的上线与下线 五.其他 一.PXC方案概述 Percona XtraDB Cluster (PXC) 是一个完全开 ...

  3. Pandas 读取Eexcel - 间隔N行,读取某列数据

    间隔N行,读取某列数据 import pandas as pd def read_vertical(sheet_name, col_idx, gap): """ 竖着读数 ...

  4. 飞码LowCode前端技术系列(二):如何便捷配置出页面 | 京东云技术团队

    一.配置解法 飞码LowCode前端技术(一)中飞码提出了至少需要满足2个大能力点以及对应16个细化点.在业务复杂的场景下数据具有流转性质,事件的触发会改变数据.同时也会触发其他事件等情况.飞码使用数 ...

  5. Codeforces Round 905 Div 1 (CF1887)

    A1. Dances (Easy version) 把 \(a,b\) 序列都从小到大排序,\(a\) 贪心删大的,\(b\) 贪心删小的,二分答案并 \(O(n)\) \(\text{check}\ ...

  6. React生命周期函数(迭代合并:react 16.3)

    本文分两部分,上面的是react16.3,下部分是老版本 react 16.3生命周期更新解析 ------ 老react版本生命周期 1.组件生命周期的执行次数 只执行一次: constructor ...

  7. 浅谈一下go语言中的slice及其一些小坑

    数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成.虽然数组元素可以被修改,但是数组长度是固定的,而且在go语言中数组的长度也是数组类型的组成部分,所以不同长度或不同 ...

  8. XML文件的解析--libxml库函数解释

    [c语言]XML文件的解析--libxml库函数解释 2009-09-02 13:12 XML文件的解析--libxml库函数解释 libxml(一)                          ...

  9. vivado仿真(无需testbench)

    vivado仿真(无testbench) 实现步骤 新建一个工程并添加自己编写的Verilog文件 添加后vivado会自动识别文件中的module 创建block design文件,添加模块 添加前 ...

  10. 超实用:通过文字就可以操纵这款AI表格

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 工具介绍 今天给大家分享超实用的AI表格ChatExcel,这个工具是由北大团队在2022年3月开始开发的AI表格处理神器 ...