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下开发并编译PHP扩展的方法
-
WINDOWS下givm安装使用方法(编译程序)
-
Windows下编译并使用64位GMP
-
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
-
使用windows下的Eclipse或者IDEA远程连接Linux的Hadoop并运行wordcount
-
windows下使用Visual Studio编译可以调试的FFmpeg
-
在Windows下编译Cef3.2623并加入mp3、mp4支持(附带源码包和最终DLL)
-
linux学习笔记——在ubuntu系统下编译运行c程序并使用makefile管理项目
-
Windows下使用VS Code 编译、运行和调试C/C++
-
Windows下安装VScode 并使用及中文配置方法