前言
在尝试曼德罗曼分形编程时发现需要用到高精度浮点数的计算,在网上查到有个现成的大整数及高精度运算库GMP可以使用,故尝试编译此库的源码,并在VS2022下使用,获得成功。本文记录下这一过程。
一、下载GMP6.3
打开链接The GNU MP Bignum Library,
下载gmp-6.3.0.tar.xz,用7-zip解压出tar文件后,再用7-zip解压到指定目录下,本文解压到D:\Fractal\gmp6.3\gmp-6.3.0,(也可以用其他解压工具)
二、安装编译软件MSYS2
安装MSYS2(mingw && gcc)
MSYS2官网:https://www.msys2.org/
安装
下载安装程序(官网首页有):msys2-x86_64-20241208.exe ,复制链接用迅雷下载很快,直接下载可能困难
运行安装程序。MSYS2,此处路径设为C:\msys64
(更新包数据库和基础包。从开始菜单运行“MSYS2 UCRT64”。使用以下命令更新其余基本软件包pacman -Syu,本文安装时已是最新文件,未做此步)
现在 MSYS2 已安装好,接下来安装 mingw-w64 GCC :
pacman -S mingw-w64-ucrt-x86_64-gcc
输入Y继续安装
查看gcc 版本:
gcc –version
在power shell下增加路径setx path "%PATH%;C:\msys64\ucrt64\bin" /M,或windows设置里系统信息-高级系统设置里环境变量下载系统变量的path里添加:
从上述安装的模块中,可以看到已包含gmp大数计算包,且版本为6.3,动态库(libgmp-10.dll,libmpfr-6.dll)可以在C:\msys64\ucrt64\bin目录下找到,头文件(gmp.h,gmpxx.h, )可以在C:\msys64\ucrt64\include目录下找到,但静态库libgmp-10.lib文件在C:\msys64\ucrt64\bin下找不到,
本文暂不使用上述库文件,通过以下第三部分自行编译gmp获取库文件
三、编译GMP
编译GMP6.3
3.1,为便于使用,安装系列工具,命令如下:
pacman -S --needed base-devel mingw-w64-x86_64-toolchain,
共52个模块,运行初始及结束的截图:
3.2 GMP的编译
此节讲述了gmp的源码编译过程,便于后续根据不同项目的特点扩充修新的函数。
在msys2 ucrt64窗口下,
cd d:/fractal/gmp6.3/gmp-6.3.0
依次执行:
1)./configure
2)make
3)make check
4)make install
成功执行后,生成的h,a文件也复制到了 C:\msys64\ucrt64\lib及include目录下,本文中使用gmp下.libs目录里的,详见第四部分。
3.3,适用于windows的lib和dll文件的生成
分解出.o文件:
ar x libgmp.a
生成dll文件及def文件:
gcc -shared -o libgmp-10.dll *.o -Wl,--export-all-symbols,--output-def,libgmp-10.def
编辑def文件,第一行增加以下语句:LIBRARY libgmp-10.dll,
在ucrt64窗口下下换以下新命令生成def文件,
dlltool -d libgmp-10.def -l libgmp-10.lib
生成的libgmp-10.lib文件大小变为472k,编译成功。
(试过另一个方法,进入windows的dos界面,运行VS2022自带的lib /machine:i386 /def:libgmp-10.def生成的lib 文件只有131k,有问题,导致第4部分使用时编译出错,找不到库函数。)
四,VS下使用gmp
4.1 在需要用gmp的项目下设置如下
4.1.1) 添加头文件
代码中添加gmp.h的含目录的完整文件名如下:
#include "D:\Fractal\gmp6.3\gmp-6.3.0/gmp.h"
4.1.2)静态链接库
项目属性下链接器下的附加库目录里增加lib库的路径D:\Fractal\gmp6.3\gmp-6.3.0/.libs
4.1.3)动态运行库
将libgmp-10.dll文件复制到c:\windows\system32目录下,即可在需要时自动加载
4.2 编译
VS2022下进行编译;
4.3 运行测试
曼德罗曼分形程序运行正常,如下图,其中第一个图是初始图,第二个图是选取了其中一极小区域,且横竖各放大1234亿倍后的图,使用了gmp里的高精度浮点运行函数来计算;
总结
以上是在Windows11下编译GMP6.3,及在VS2022下调用的过程记录,供参考。