找回密码
 立即注册
首页 业界区 安全 CMake构建学习笔记28-gmp&mpfr库的构建

CMake构建学习笔记28-gmp&mpfr库的构建

井晶灵 2025-11-21 10:25:01
1. 引言

gmp 是一个用于任意精度整数、有理数和浮点数运算的高效C语言库;mpfr 构建在 gmp 之上,专注于正确舍入的任意精度浮点运算。这两个库都是非常底层的库,通常一起使用。
2. 构建

使用本系列文章(《CMake构建学习笔记-目录》)实现的自动化工具 BuildCppDependency 来进行构建 gmp 和 mpfr。以 gmp 为例,在 Windows 平台下输入指令:
  1. ./BuildCppDependency.ps1 `
  2.   -Generator "Visual Studio 16 2019" `
  3.   -InstallDir "$env:GISBasic" `
  4.   -SymbolDir "$env:GISBasic/symbols" `
  5.   -Install gmp
复制代码
在 Linux (Ubuntu) 平台下输入指令:
  1. ./build.sh -install gmp -installdir "$GISBasic"
复制代码
虽然可以直接使用工具,但是还是说一下构建的细节。在 Windows 平台下,想用 MSVC 来构建 gmp 和 mpfr 还是挺困难的,因为 gmp 和 mpfr 是 GNU 项目,只提供 Linux 下的构建方式。要组织成 CMake 项目需要对项目本身有一定的了解,所以笔者这里也不硬搞了,直接使用了 vcpkg 的预编译包,指令的实现其实就是将这个预编译包解压安装。
不过在 Linux/Ubuntu 下就可以自己编写脚本,使用 Autotools + GCC + Make 工具链来进行构建了。gmp的构建脚本如下:
[code]#!/bin/bash# ===========================================# gmp.sh - 构建 GMP 库 # 接收参数:#   -installdir     # 安装目录(必须)#   -force               # 强制重新构建#   -noclean             # 不清理临时文件# ===========================================set -e  # 遇到错误立即退出# 默认值InstallDir=""FORCE=falseNOClean=false# 解析可选参数while [[ $# -gt 0 ]]; do  case $1 in    -installdir)      InstallDir="$2"      shift 2      ;;    -force)      FORCE=true      shift      ;;    -noclean)      NOClean=true      shift      ;;    --) # 分隔符,后面是项目参数      shift      break      ;;    -*)      echo "未知参数: $1"      exit 1      ;;    *)      break  # 非选项参数开始,停止解析      ;;  esacdone# 检查必要参数if [[ -z "$InstallDir" ]]; then  echo "❌ 错误: 必须指定 -installdir "  exit 1fi# 项目配置InstallDir=$(realpath "$InstallDir")ScriptDir=$(pwd)SourceBaseDir=$(realpath "../Source")       # 绝对路径Name="gmp-6.3.0"SourceZipFile="${SourceBaseDir}/${Name}.tar.xz"ExtractedSourceDir="${SourceBaseDir}/${Name}"BuildDir="${ScriptDir}/build-${Name}"       # 明确区分 build 目录TargetFile="${InstallDir}/include/gmp.h"# 检查源码包是否存在if [[ ! -f "$SourceZipFile" ]]; then  echo "❌ 源码包未找到: $SourceZipFile"  exit 1fi# 如果没有 -force 且目标文件已存在,跳过构建if [[ "$FORCE" == false && -f "$TargetFile" ]]; then    echo "✅ GMP 已安装: $TargetFile,跳过构建(使用 -force 可强制重建)"    exit 0fiif [[ "$FORCE" == true ]]; then    echo "⚠️  启用 -force 模式,将重新构建 GMP"    # 清理旧的构建目录(如果存在)    rm -rf "$BuildDir"fiecho "
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册