呵烘稿 发表于 2025-11-22 14:10:00

CMake构建学习笔记29-SuiteSparse库的构建

1 介绍

在上一篇文章《CMake构建学习笔记26-OpenBLAS库的构建》中介绍的OpenBLAS是用来解决稠密矩阵相关问题的,例如数值优化中的最小二乘问题。但是如果问题模型中的已知参数太多,就会导致求解的矩阵中存在大量的零值,直接使用常规的稠密矩阵方法求解不仅速度慢,对内存资源的消耗也是一个问题。这种存在大量的零值的矩阵就是稀疏矩阵,会采用一些专门的方法优化这一类问题的求解。
SuiteSparse 就是一个用于高效求解稀疏矩阵相关的问题的开源软件包集合。它由 Timothy A. Davis 教授开发和维护,被广泛应用于科学计算、工程仿真、图论、机器学习等领域。
2 构建

SuiteSparse需要3个依赖库:OpenBLAS、gmp 和 mpfr ,正好这三个依赖库我们在前面的文章《CMake构建学习笔记26-OpenBLAS库的构建》和《CMake构建学习笔记28-gmp&mpfr库的构建》中都介绍过,这里就不再赘叙了。
还是使用本系列文章(《CMake构建学习笔记-目录》)实现的自动化工具 BuildCppDependency 来构建 SuiteSparse。在 Windows 平台下输入指令:
./BuildCppDependency.ps1 `
-Generator "Visual Studio 16 2019" `
-InstallDir "$env:GISBasic" `
-SymbolDir "$env:GISBasic/symbols" `
-Install SuiteSparse在 Linux (Ubuntu) 平台下输入指令:
./build.sh -install SuiteSparse -installdir "$GISBasic"进一步看一下 Windows 下的构建脚本,主要是为了看一下 CMake 构建参数:
# SuiteSparse.ps1
param(   
    $Name = "SuiteSparse-7.11.0",
    $SourceDir = "../Source",
    $Generator,
    $InstallDir,
    $SymbolDir,
    $Force = $false,      # 是否强制重新构建
    $Cleanup = $true      # 是否在构建完成后删除源码和构建目录
)

# 目标文件
$DllPath = "$InstallDir/bin/umfpack.dll"

# 依赖库数组
$Librarys = @("OpenBLAS", "gmp", "mpfr")

# 符号库文件
$PdbFiles = @(
    "SuiteSparse_config/RelWithDebInfo/suitesparseconfig.pdb"
    "Mongoose/RelWithDebInfo/suitesparse_mongoose.pdb"
    "AMD/RelWithDebInfo/amd.pdb"
    "BTF/RelWithDebInfo/btf.pdb"
    "CAMD/RelWithDebInfo/camd.pdb"
    "CCOLAMD/RelWithDebInfo/ccolamd.pdb"
    "CHOLMOD/RelWithDebInfo/cholmod.pdb"
    "COLAMD/RelWithDebInfo/colamd.pdb"
    "CXSparse/RelWithDebInfo/cxsparse.pdb"
    "GraphBLAS/RelWithDebInfo/graphblas.pdb"   
    "KLU/RelWithDebInfo/klu.pdb"
    "LAGraph/dlls/RelWithDebInfo/lagraph.pdb"
    "LAGraph/dlls/RelWithDebInfo/lagraphx.pdb"
    "LDL/RelWithDebInfo/ldl.pdb"
    "ParU/RelWithDebInfo/paru.pdb"
    "RBio/RelWithDebInfo/rbio.pdb"
    "SPEX/RelWithDebInfo/spex.pdb"
    "SPEX/RelWithDebInfo/spexpython.pdb"
    "SPQR/RelWithDebInfo/spqr.pdb"
    "UMFPACK/RelWithDebInfo/umfpack.pdb"
)

# 额外构建参数
$CMakeCacheVariables = @{
    SUITESPARSE_REQUIRE_BLAS = "ON"
    SUITESPARSE_USE_64BIT_BLAS = "ON"   
    BUILD_TESTING = "OFF"
    BUILD_STATIC_LIBS = "OFF"
    BUILD_SHARED_LIBS = "ON"
    SUITESPARSE_USE_FORTRAN = "ON"
    SUITESPARSE_C_TO_FORTRAN = "(name,NAME) name##_"
}

. ./build-common.ps1 -Name $Name `
    -SourceDir $SourceDir `
    -InstallDir $InstallDir `
    -SymbolDir $SymbolDir `
    -Generator $Generator `
    -TargetDll $DllPath `
    -PdbFiles $PdbFiles `
    -CMakeCacheVariables $CMakeCacheVariables `
    -MultiConfig $true `
    -Force $Force `
    -Cleanup $Cleanup `
    -Librarys $Librarys这几个构建参数比较关键,否者容易构建失败,这里就详细说明一下:

[*]SUITESPARSE_REQUIRE_BLAS = "ON":强制要求在构建 SuiteSparse 时链接 BLAS/LAPACK 库。
[*]SUITESPARSE_USE_64BIT_BLAS = "ON":启用对 64 位整数索引的 BLAS/LAPACK 接口 的支持(也称为 ILP64 模式)。默认的 BLAS/LAPACK 使用 32 位整数,当处理超大规模稀疏矩阵时,链接的 OpenBLAS 必须编译为 ILP64 版本,否则会出现链接错误或运行时崩溃。
[*]BUILD_TESTING = "OFF":禁用测试程序的构建。
[*]BUILD_STATIC_LIBS = "OFF"/BUILD_SHARED_LIBS = "ON":只构建动态链接库,不构建静态库。
[*]SUITESPARSE_USE_FORTRAN = "ON":使用传统的 Fortran 风格 BLAS/LAPACK 接口(如函数名为 dgemm_, dpotrf_ 等)来链接外部库。
[*]SUITESPARSE_C_TO_FORTRAN = "(name,NAME) name##_":定义 C 函数如何调用 Fortran 子程序的命名转换规则。
尽管在构建 OpenBLAS 的时候,没有使用 Fortran 来构建,但是处于兼容性,OpenBLAS还是会提供 Fortran 接口。这里设置了使用传统的 Fortran 风格来调用 BLAS/LAPACK 接口,但是 SuiteSparse 本身是 C 实现的,因此调用 Fortran 接口需要对接口命名进行转换。
3. 其他

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

简千叶 发表于 2025-12-11 02:01:12

感谢,下载保存了

蔺堰 发表于 2025-12-11 05:26:38

感谢发布原创作品,程序园因你更精彩

归筠溪 发表于 2025-12-15 10:06:43

这个有用。

老僻贞 发表于 2025-12-28 08:13:08

感谢分享,下载保存了,貌似很强大

抽厉 发表于 2026-1-15 07:49:50

这个好,看起来很实用

痨砖 发表于 2026-1-16 18:35:27

收藏一下   不知道什么时候能用到

祝娜娜 发表于 2026-1-17 06:24:41

谢谢楼主提供!

忙贬 发表于 2026-1-18 19:12:07

感谢,下载保存了

司寇涵涵 发表于 2026-1-20 09:19:37

喜欢鼓捣这些软件,现在用得少,谢谢分享!

电棘缣 发表于 2026-1-25 09:20:07

前排留名,哈哈哈

荆邦 发表于 2026-1-27 04:17:22

前排留名,哈哈哈

腥狩频 发表于 2026-1-28 07:32:01

这个有用。

拼匍弦 发表于 2026-2-3 06:46:43

用心讨论,共获提升!

指陡 发表于 2026-2-5 03:28:08

这个有用。

这帜 发表于 2026-2-5 11:47:06

很好很强大我过来先占个楼 待编辑

欤夤 发表于 2026-2-7 22:24:25

过来提前占个楼

时思美 发表于 2026-2-8 00:54:37

感谢分享

簑威龙 发表于 2026-2-8 07:14:58

感谢分享

晚能 发表于 2026-2-8 11:49:51

感谢分享,学习下。
页: [1] 2
查看完整版本: CMake构建学习笔记29-SuiteSparse库的构建