最近项目需要使用到gmp,现在编译来看一下编译一下gmp。

我们需要按照mingw,在安装目录下面有msys文件夹,只要运行该目录下的msys.bat文件即可。如下图所示。
win10+编译gmp大数库(亲测可用)_加载
首先需要下载gmp-6.1.2.tar.bz2

​https://gmplib.org/​

然后就是。msys.exe

链接:https://pan.baidu.com/s/1ljX8SpbKFsWZwkBwtbcbgA

提取码:qsj4

安装msys.exe文件,我这里默认为c盘。CMD命令行进入到msys.bat目录并运行。

win10+编译gmp大数库(亲测可用)_加载_02
win10+编译gmp大数库(亲测可用)_加载_03
然后进入到gmp目录,输入tar –xjvf gmp-6.0.0a.tar.bz2解压。
设置编译路径和方式

./configure --prefix=D:/buildresult

其中prefix为编译生成路径,最好是设置一下,因为我在这里编译的时没有找到按照网络生成的msys目录下的local路径。

当然如果我们想编译dll文件,可以依次使用如下的命令

win10+编译gmp大数库(亲测可用)_加载_04

./configure –disable-static –enable-shared –prefix=D://buildresult –enable -cxx

make

make install

最后的编译结果如下图所示。
win10+编译gmp大数库(亲测可用)_动态库_05
当然也可以按照如下的方式生成lib

​http://blog.chinaunix.net/uid-29355319-id-4043188.html​

但是以上编译方式都是在linux环境下编译的(但是我试了下windows也可以这样子编译)。而我现在项目大部分在windows开发环境下。为此可以在github下载visual studio编译好的gmp
​​​ https://github.com/ShiftMediaProject/gmp如下图所示。​

win10+编译gmp大数库(亲测可用)_动态库_06
下载对应的版本即可
win10+编译gmp大数库(亲测可用)_静态库_07
使用
调用
另外一个头痛的问题就是mingw编译出来的静态库后缀名为.a,编译出来的动态库的导入库后缀名为.dll.a,而在Windows下一般使用.lib的来作为静态库或者动态库的导入库。好在VS中是能够识别.a文件作为导入库的,像加载.lib一样加载dll.a即可:

#pragma comment(lib, "libgmp.dll.a")

注意使用动态库时,单独运行时可能会提示缺少dll,libgmp.dll还依赖了mingw中的一些运行时库,根据提示找到相应的dll即可。

示例
在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;
}

以上演示了使用大数幂运算和乘法运算的过程,运行结果如下:
win10+编译gmp大数库(亲测可用)_动态库_08