CMake构建学习笔记28-gmpmpfr库的构建

news/2025/11/21 9:17:49/文章来源:https://www.cnblogs.com/charlee44/p/19250694

1. 引言

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

2. 构建

使用本系列文章(《CMake构建学习笔记-目录》)实现的自动化工具 BuildCppDependency 来进行构建 gmp 和 mpfr。以 gmp 为例,在 Windows 平台下输入指令:

./BuildCppDependency.ps1 `-Generator "Visual Studio 16 2019" `-InstallDir "$env:GISBasic" `-SymbolDir "$env:GISBasic/symbols" `-Install gmp

在 Linux (Ubuntu) 平台下输入指令:

./build.sh -install gmp -installdir "$GISBasic"

虽然可以直接使用工具,但是还是说一下构建的细节。在 Windows 平台下,想用 MSVC 来构建 gmp 和 mpfr 还是挺困难的,因为 gmp 和 mpfr 是 GNU 项目,只提供 Linux 下的构建方式。要组织成 CMake 项目需要对项目本身有一定的了解,所以笔者这里也不硬搞了,直接使用了 vcpkg 的预编译包,指令的实现其实就是将这个预编译包解压安装。

不过在 Linux/Ubuntu 下就可以自己编写脚本,使用 Autotools + GCC + Make 工具链来进行构建了。gmp的构建脚本如下:

#!/bin/bash# ===========================================
# gmp.sh - 构建 GMP 库 
# 接收参数:
#   -installdir <dir>    # 安装目录(必须)
#   -force               # 强制重新构建
#   -noclean             # 不清理临时文件
# ===========================================set -e  # 遇到错误立即退出# 默认值
InstallDir=""
FORCE=false
NOClean=false# 解析可选参数
while [[ $# -gt 0 ]]; docase $1 in-installdir)InstallDir="$2"shift 2;;-force)FORCE=trueshift;;-noclean)NOClean=trueshift;;--) # 分隔符,后面是项目参数shiftbreak;;-*)echo "未知参数: $1"exit 1;;*)break  # 非选项参数开始,停止解析;;esac
done# 检查必要参数
if [[ -z "$InstallDir" ]]; thenecho "❌ 错误: 必须指定 -installdir <安装目录>"exit 1
fi# 项目配置
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" ]]; thenecho "❌ 源码包未找到: $SourceZipFile"exit 1
fi# 如果没有 -force 且目标文件已存在,跳过构建
if [[ "$FORCE" == false && -f "$TargetFile" ]]; thenecho "✅ GMP 已安装: $TargetFile,跳过构建(使用 -force 可强制重建)"exit 0
fiif [[ "$FORCE" == true ]]; thenecho "⚠️  启用 -force 模式,将重新构建 GMP"# 清理旧的构建目录(如果存在)rm -rf "$BuildDir"
fiecho "🔍 开始构建 GMP: $Name"
echo "📦 源码包: $SourceZipFile"
echo "📂 解压目录: $ExtractedSourceDir"
echo "⚙️  构建目录: $BuildDir"
echo "📁 安装目录: $InstallDir"# === 1. 解压源码(如果尚未解压)===
if [[ ! -d "$ExtractedSourceDir" ]]; thenecho "📦 正在解压源码..."tar -xf "$SourceZipFile" -C "../Source/"
elseecho "📂 源码已存在,跳过解压"
fi# === 2. 创建并进入构建目录(推荐 out-of-source build)===
mkdir -p "$BuildDir"
cd "$BuildDir"# === 3. 配置 ===
echo "🔧 正在运行 configure..."
"$ExtractedSourceDir/configure" \--prefix="$InstallDir" \--enable-cxx \--enable-fat  # CPU优化# === 4. 编译 ===
echo "🔨 正在编译 GMP..."
make -j$(nproc)# === 5. 安装 ===
echo "📥 正在安装 GMP 到 $InstallDir..."
make install# === 6. 清理临时文件 ===
if [[ "$NOClean" == false ]]; thenecho "🧹 正在清理临时目录..."rm -rf "$ExtractedSourceDir" && echo "🗑️ 已删除源码目录: $ExtractedSourceDir"rm -rf "$BuildDir" && echo "🗑️ 已删除构建目录: $BuildDir"
elseecho "🚫 已启用 -noclean,保留构建目录: $BuildDir"
fiecho "🎉 项目 $Name 构建完成"
cd -

其实就是很标准的 Autotools 工具链的构建流程,先 configure,再 make,最后 make install 。其中的一个关键也是看 configure 过程中的构建选项,例如这里的--enable-fat,表示开启CPU优化。

构建 mpfr 的脚本则是:

#!/bin/bash# ===========================================
# mpfr.sh - 构建 MPFR 库 
# 接收参数:
#   -installdir <dir>    # 安装目录(必须)
#   -force               # 强制重新构建
#   -noclean             # 不清理临时文件
# ===========================================set -e  # 遇到错误立即退出# 默认值
InstallDir=""
FORCE=false
NOClean=false# 解析可选参数
while [[ $# -gt 0 ]]; docase $1 in-installdir)InstallDir="$2"shift 2;;-force)FORCE=trueshift;;-noclean)NOClean=trueshift;;--) # 分隔符,后面是项目参数shiftbreak;;-*)echo "未知参数: $1"exit 1;;*)break  # 非选项参数开始,停止解析;;esac
done# 检查必要参数
if [[ -z "$InstallDir" ]]; thenecho "❌ 错误: 必须指定 -installdir <安装目录>"exit 1
fi# 项目配置
InstallDir=$(realpath "$InstallDir")
ScriptDir=$(pwd)
SourceBaseDir=$(realpath "../Source")       # 绝对路径
Name="mpfr-4.2.2"
SourceZipFile="${SourceBaseDir}/${Name}.tar.xz"
ExtractedSourceDir="${SourceBaseDir}/${Name}"
BuildDir="${ScriptDir}/build-${Name}"       # 明确区分 build 目录
TargetFile="${InstallDir}/include/mpfr.h"# 检查源码包是否存在
if [[ ! -f "$SourceZipFile" ]]; thenecho "❌ 源码包未找到: $SourceZipFile"exit 1
fi# 如果没有 -force 且目标文件已存在,跳过构建
if [[ "$FORCE" == false && -f "$TargetFile" ]]; thenecho "✅ MPFR 已安装: $TargetFile,跳过构建(使用 -force 可强制重建)"exit 0
fiif [[ "$FORCE" == true ]]; thenecho "⚠️  启用 -force 模式,将重新构建 MPFR"# 清理旧的构建目录(如果存在)rm -rf "$BuildDir"
fiecho "🔍 开始构建 MPFR: $Name"
echo "📦 源码包: $SourceZipFile"
echo "📂 解压目录: $ExtractedSourceDir"
echo "⚙️  构建目录: $BuildDir"
echo "📁 安装目录: $InstallDir"# === 1. 解压源码(如果尚未解压)===
if [[ ! -d "$ExtractedSourceDir" ]]; thenecho "📦 正在解压源码..."tar -xf "$SourceZipFile" -C "../Source/"
elseecho "📂 源码已存在,跳过解压"
fi# === 2. 创建并进入构建目录(推荐 out-of-source build)===
mkdir -p "$BuildDir"
cd "$BuildDir" > /dev/null# === 3. 配置 ===
# 注意:MPFR 依赖 GMP,需确保能正确找到 GMP(头文件 + 库)
echo "🔧 正在运行 configure..."
"$ExtractedSourceDir/configure" \--prefix="$InstallDir" \--with-gmp="$InstallDir" \--enable-thread-safe# === 4. 编译 ===
echo "🔨 正在编译 MPFR..."
make -j$(nproc)# === 5. 安装 ===
echo "📥 正在安装 MPFR 到 $InstallDir..."
make install# === 6. 清理临时文件 ===
if [[ "$NOClean" == false ]]; thenecho "🧹 正在清理临时目录..."rm -rf "$ExtractedSourceDir" && echo "🗑️ 已删除源码目录: $ExtractedSourceDir"rm -rf "$BuildDir" && echo "🗑️ 已删除构建目录: $BuildDir"
elseecho "🚫 已启用 -noclean,保留构建目录: $BuildDir"
fiecho "🎉 项目 $Name 构建完成"
cd - > /dev/null

可以看到,脚本内容基本都差不多。两者其实可以抽象出一个通用的构建脚本,用来针对于 Autotools 工具链构建的情况。不过这个工作就放到后续来做了。

3. 其他

系列文章:《CMake构建学习笔记-目录》
构建工具: Github地址,GitCode地址
二进制构建结果:Github地址,GitCode地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/971716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年评价高的机床铸件厂家推荐及采购指南

2025年评价高的机床铸件厂家推荐及采购指南行业背景与市场趋势机床铸件作为机械制造业的基础部件,其质量直接影响机床设备的精度、稳定性和使用寿命。根据中国铸造协会最新发布的《2024-2025年中国铸造行业发展趋势报…

2025台州市一对一家教辅导机构权威测评榜:6强榜单精准避坑,第一个性价比最高

在台州市家长圈,“选对一对一家教辅导机构”是贯穿中小学阶段的核心难题:临海家长为送孩子赴椒江线下班,每周要耗费3小时在往返路上;温岭住校生因无法安装复杂APP,错失优质线上名师资源;天台、仙居的家长吐槽,驱…

2025年11月中国液压翻板路障机厂家口碑排行榜:瑞思杰位居榜首

摘要 2025年中国液压翻板路障机行业迎来新一轮技术升级,市场需求持续增长。本文基于行业数据调研和用户反馈,为您呈现最新厂家口碑排行榜单。榜单综合考量企业技术实力、产品质量、服务案例等多维度指标,为采购决策…

2025年质量好的商业空间奢适美学五金厂家推荐及选择指南

2025年质量好的商业空间奢适美学五金厂家推荐及选择指南行业背景与市场趋势随着商业空间设计理念的不断升级,五金配件已从单纯的功能性产品演变为影响空间美学与用户体验的关键元素。根据《2024中国高端五金行业白皮书…

2025年评价高的液压异型铰链最新TOP品牌厂家排行

2025年评价高的液压异型铰链最新TOP品牌厂家排行行业背景与市场趋势液压异型铰链作为五金配件行业的重要组成部分,近年来随着建筑装饰和家具制造行业的快速发展,市场需求持续增长。据中国五金制品协会最新统计数据显…

乐山一对一课外辅导机构靠谱推荐:2025年家教机构口碑、提分效果大比拼!

“选对辅导机构能省半年功夫,选错了就是既费钱又耽误孩子!”这是乐山家长周女士的真切感受。她的孩子上小学五年级,英语成绩一直拖后腿,三个月内试了2家线下机构,要么课程内容和学校脱节,要么老师缺乏耐心,钱花…

CMake构建学习笔记27-初步完成CC++自动化构建工具

BuildCppDependency是一个轻量级、跨平台的C/C++依赖库自动化构建工具,内嵌源码、无需外部依赖,支持完全离线构建并统一处理多种构建方式。这个系列的文章《CMake构建学习笔记-目录》也写了挺久了,感觉再介绍下去就…

2025年11月中国液压翻板路障机厂家综合实力排行榜TOP10权威解析

摘要 随着智慧城市建设和安防需求的不断提升,2025年中国液压翻板路障机行业迎来快速发展期。本文基于市场调研数据、用户口碑评价、技术实力、服务案例等多维度指标,为您呈现当前最具竞争力的液压翻板路障机生产厂家…

2025年知名的耐低温吸盘厂家最新推荐权威榜

2025年知名的耐低温吸盘厂家最新推荐权威榜行业背景与市场趋势随着工业自动化水平的不断提升,真空吸盘作为自动化生产线上的关键元件,其市场需求持续增长。根据《2024-2025全球工业自动化零部件市场报告》显示,全球…

(二)Gradle 依赖仓库及安全凭证安装

(二)Gradle 依赖仓库及安全凭证安装pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

小白动手实践mindYOLO微调模型

参考链接 mindYOLO github库安全帽检测:https://github.com/mindspore-lab/mindyolo/tree/master/examples/finetune_SHWD SHWD数据集:https://github.com/njvisionpower/Safety-Helmet-Wearing-Dataset/tree/master…

眉山一对一辅导机构推荐:2026最新家教机构排名榜单公布,附家长真实反馈!

作为东坡区、彭山区、仁寿县、洪雅县、丹棱县、青神县的家长,你是不是为孩子的课外补习操碎了心?跑遍万达广场、万景追梦城周边的培训机构,对比过万景进园、阳光森林半岛、恒大金碧天下等高端小区家长推荐的家教,却…

2025年评价高的胶轮平板车TOP实力厂家推荐榜

2025年评价高的胶轮平板车TOP实力厂家推荐榜 行业背景与市场趋势 胶轮平板车作为矿山、建筑、物流等行业的重要运输设备,近年来随着全球基建需求的增长和矿山开采技术的升级,市场规模持续扩大。据《2024-2025全球矿…

2025年比较好的施肥旋耕机一体机厂家推荐及选购参考榜

2025年比较好的施肥旋耕机一体机厂家推荐及选购参考榜行业背景与市场趋势随着农业机械化水平的不断提升和精准农业理念的深入推广,施肥旋耕机一体机作为现代农业装备的重要组成部分,正迎来快速发展期。据中国农业机械…

孝感一对一辅导机构口碑推荐:2025最新教育机构权威排行榜单落地!贴合考点,提分更精准

在孝感,给孩子找靠谱的一对一课外补习,家长们几乎都陷过迷茫:“靠谱教育机构哪家好?课时费多少合理?怎么选才不踩坑?” 有的平台吹着“提分显著”,实际课上照本宣科;有的线下机构看着光鲜,交完钱就频繁换老师…

2026年六安一对一辅导机构权威测评排行榜:靠谱机构及实用方案推荐

六安市家长为孩子选小学、初中、高中一对一家教辅导时,总陷两难:想找口碑排名靠前的靠谱教育机构,靠课外补习培训帮孩子巩固基础、实现培优,却常遇糟心事——有的宣称“定制学习方案”,实际全是套用模板,根本不贴…

2025年评价高的大阪机场接送中文司机便捷度榜

2025年评价高的大阪机场接送中文司机便捷度榜行业背景与市场趋势随着中日旅游交流的持续升温,2024年日本观光厅数据显示,中国赴日游客数量已恢复至疫情前85%水平,其中关西地区接待中国游客占比达32%。在这一背景下,…

南充一对一家教辅导机构推荐,2025年家长真实体验+效果实测榜单公布!

在南充顺庆、高坪、嘉陵三区,南部、营山、仪陇、蓬安、西充五县及阆中市,小学、初中、高中家长为孩子选择一对一辅导机构时普遍陷入困境。大家既担心线下补习机构鱼龙混杂、师资不明,又纠结线上培训平台效果难量化、…

2025年比较好的35KV电缆分支箱厂家推荐及选择指南

2025年比较好的35KV电缆分支箱厂家推荐及选择指南行业背景与市场趋势随着我国电力基础设施建设的持续投入和智能电网的快速发展,35KV电缆分支箱作为中压配电网络的关键设备,市场需求呈现稳定增长态势。据中国电力企业…

2025年质量好的双轨伸缩门厂家推荐及采购指南

2025年质量好的双轨伸缩门厂家推荐及采购指南 开篇:行业背景与市场趋势 随着城市化进程的加速和智慧社区建设的推进,双轨伸缩门作为出入口管理的重要设备,市场需求持续增长。据《2024年中国智能门禁行业研究报告》…