#gmp #rational-numbers #bignum #complex-numbers #ffi #numeric

sys no-std gmp-mpfr-sys

Rust 对 GMP、MPFR 和 MPC 的 FFI 绑定

54 个稳定版本

1.6.4 2024 年 6 月 5 日
1.6.2 2024 年 1 月 20 日
1.6.1 2023 年 8 月 23 日
1.6.0 2023 年 7 月 30 日
0.6.0 2017 年 2 月 6 日

391数学 中排名

Download history 3090/week @ 2024-05-04 3501/week @ 2024-05-11 2915/week @ 2024-05-18 2936/week @ 2024-05-25 3909/week @ 2024-06-01 4957/week @ 2024-06-08 3463/week @ 2024-06-15 2907/week @ 2024-06-22 2319/week @ 2024-06-29 2474/week @ 2024-07-06 3332/week @ 2024-07-13 3210/week @ 2024-07-20 2787/week @ 2024-07-27 2497/week @ 2024-08-03 3222/week @ 2024-08-10 2207/week @ 2024-08-17

11,135 每月下载量
用于 74 个 Crates(直接使用 19 个)

LGPL-3.0+

17MB
432K SLoC

C 218K SLoC // 0.2% comments Assembly 144K SLoC // 0.0% comments M4 29K SLoC // 0.3% comments Shell 25K SLoC // 0.2% comments C++ 5K SLoC // 0.2% comments Rust 4K SLoC // 0.1% comments Perl 3.5K SLoC // 0.3% comments GNU Style Assembly 1.5K SLoC // 0.0% comments Automake 1K SLoC // 0.5% comments Pan 340 SLoC // 0.1% comments Happy 266 SLoC Emacs Lisp 203 SLoC // 0.4% comments FORTRAN Legacy 24 SLoC // 0.6% comments

包含(autotools 混淆代码,1MB) gmp-6.3.0-c/configure,(autotools 混淆代码,635KB) mpfr-4.2.1-c/configure,(autotools 混淆代码,480KB) mpc-1.3.1-c/configure,(obscure autoconf code,145KB) gmp-6.3.0-c/configure.ac,(obscure autoconf code,36KB) mpfr-4.2.1-c/configure.ac,(obscure autoconf code,8KB) mpc-1.3.1-c/configure.ac

Rust 对 GMP、MPFR 和 MPC 的低级绑定

gmp-mpfr-sys crate 为以下 GNU 高精度库提供了 Rust FFI 绑定

  • GMP 用于整数和有理数,
  • MPFR 用于浮点数,以及
  • MPC 用于复数。

三个库的源代码包含在包中。

gmp-mpfr-sys crate 是自由软件:您可以在自由软件基金会发布的 GNU 较小通用公共许可证的条款下重新分发和/或修改它,许可证版本为 3 或(根据您的选择)任何后续版本。有关详细信息,请参阅 GNU LGPLGNU GPL 的完整文本。

新增功能

版本 1.6.4 新功能(2024-06-05)

  • 意外地从 GNU 库的文档中删除了许可头文件(问题 34)。

版本 1.6.3 新功能(2024-05-30)

  • 使用 MinGW 进行交叉编译时,使用 GMP 理解的主机(合并请求 5)。

版本 1.6.2 新功能(2024-01-20)

  • 错误修复:使用系统库时,某些情况下构建会失败(问题 32)。

版本 1.6.1 新功能(2023-08-23)

  • MPFR 从版本 4.2.0-p12 更新到 4.2.1。

版本 1.6.0 新闻(2023-07-30)

  • GMP 从版本 6.2.1 更新到 6.3.0。
  • MPFR 从版本 4.2.0-p9 更新到 4.2.0-p12。

其他版本

其他版本的详细信息可以在 RELEASES.md 中找到。

基本功能

该软件包包含三个模块

  • gmp 提供了对 GMP 的外部 FFI 绑定。
  • mpfr 提供了对 MPFR 的外部 FFI 绑定。
  • mpc 提供了对 MPC 的外部 FFI 绑定。

本软件包发布提供的版本是 GMP 版本 6.3.0,MPFR 版本 4.2.1,以及 MPC 版本 1.3.1。

如果您需要一个高级 API,请考虑使用 Rug,这是一个提供任意精度整数和浮点数的软件包,具有正确的舍入。

  • Integer 是一个任意精度的 big number 整数。
  • Rational 是一个任意精度的 big number 有理数。
  • Float 是一个正确舍入的多精度浮点数。
  • Complex 是一个正确舍入的多精度复数。

名称前缀

由于模块和枚举类型提供了命名空间,C 名称中的大多数前缀都被移除。然而,当前缀不是整个单词时,它不会被移除。例如 mp_set_memory_functions 变为 gmp::set_memory_functions,但 mpz_init 变为 gmp::mpz_init 而不是 gmp::z_init,并且 MPFR_RNDNenum MPFR_RND_T 变为 mpfr::rnd_t::RNDN 而不是 mpfr::rnd_t::N。此外,类型 mpfr::mpfr_tmpc::mpc_t 缩短为 mpfr::tmpc::t

类型

与C库不同,类型 gmp::mpz_tgmp::mpq_tgmp::mpf_tgmp::randstate_tmpfr::mpfr_tmpc::mpc_t 都被直接定义为结构体,而不是单元素数组。

未记录或过时的函数

这些绑定不包含未记录或过时的函数和宏。

使用 gmp-mpfr-sys

gmp-mpfr-sys 包可在 crates.io 上找到。要在您的包中使用 gmp-mpfr-sys,请在 Cargo.toml 中将其添加为依赖项

[dependencies]
gmp-mpfr-sys = "1.6"

此包需要 rustc 版本 1.65.0 或更高版本。

如果C库有主要版本号的提升,并删除了一些已弃用的函数,但Rust绑定中没有删除功能,那么gmp-mpfr-sys将进行小版本号的提升而不是大版本号的提升。这允许在那些使用Rust绑定但不直接使用C库的包之间有更高的兼容性。

另一方面,如果依赖的包使用了内部实现细节,或者包含了一个直接使用使用C构建的头文件(.h)和库文件(.a),则最好使用版本 "~1.6" 而不是版本 "1.6" 作为依赖,以确保在C级别上也有向后兼容性。

可选功能

gmp-mpfr-sys 包有两个可选功能

  1. mpfr,默认启用。包括MPFR库所必需。
  2. mpc,默认启用。包括MPC库所必需。此功能需要mpfr功能。

GMP库始终包括在内。

两个可选功能默认启用;要选择性地使用功能,您可以将依赖项添加到 Cargo.toml 中,如下所示

[dependencies.gmp-mpfr-sys]
version = "1.6"
default-features = false
features = ["mpfr"]

这里只选择了mpfr功能。

实验性可选功能

如果删除实验性功能,则不会被视为破坏性更改。然而,删除实验性功能将需要小版本号的提升。

实验性功能可能也不适用于所有平台。

有三个实验性功能

  1. use-system-libs,默认禁用。使用此功能,将使用GMPMPFRMPC的系统库(如果已启用),而不是从源代码构建它们。系统库的主版本号必须等于包提供的版本,系统库的次版本号必须大于或等于包提供的版本。对于修补版本没有限制。
  2. force-cross,默认禁用。如果没有此功能,检测到交叉编译时构建将失败,因为交叉编译未经过测试或不受支持,可能导致难以调试的静默错误,特别是如果这个包是间接依赖项。作为例外,从x86_64编译到i686不需要此功能。(在MinGW上编译没有这个例外,因为MinGW不支持从64位到32位的交叉编译。)
  3. c-no-tests,默认禁用。使用此功能将跳过C库的测试。不建议这样做;GMP源代码误编译的风险相当高。如果确实误编译,测试很可能触发由编译器引入的错误。

元数据

gmp-mpfr-sys包将一些元数据传递给其依赖项

  1. DEP_GMP_LIMB_BITS包含每根数位的位数,为32或64。
  2. DEP_GMP_OUT_DIR包含一个目录的路径,该目录包含两个子目录:第一个子目录命名为lib,包含生成的库(.a)文件,第二个子目录命名为include,包含相应的头文件(.h)。
  3. DEP_GMP_LIB_DIR包含DEP_GMP_OUT_DIR目录的lib子目录的路径。
  4. DEP_GMP_INCLUDE_DIR包含DEP_GMP_OUT_DIR目录的include子目录的路径。

依赖项包可以在其构建脚本中使用这些环境变量。

在GNU/Linux上构建

警告:构建系统不支持在包含空格的路径上构建。

要在GNU/Linux上构建,只需确保您的系统已安装diffutilsgccm4make。例如,在Fedora上

sudo dnf install diffutils gcc m4 make

请注意,您可以通过安装clang并设置环境变量CC=clang来在构建crate之前使用Clang代替GCC。

在macOS上构建

警告:构建系统不支持在包含空格的路径上构建。

要在macOS上构建,您需要命令行开发工具。要安装它们,请在终端中运行以下命令

xcode-select --install

在Windows上构建

警告:构建系统不支持在包含空格的路径上构建。

您可以使用Rust GNU工具链和一个最新的MSYS2安装来在Windows上构建。以下是64位环境的某些步骤。(32位:32位环境的更改以如下注释的方式编写。)

安装MSYS2

  1. 使用安装程序安装MSYS2。

  2. 从开始菜单启动MSYS2 MinGW 64位终端。(32位:启动MSYS2 MinGW 32位终端。)

  3. 安装所需的工具。

    pacman -S pacman-mirrors
    pacman -S diffutils m4 make mingw-w64-x86_64-gcc
    

    (32位:安装mingw-w64-i686-gcc代替mingw-w64-x86_64-gcc。)

然后,要构建依赖于此crate的crate

  1. 从开始菜单启动MSYS2 MinGW 64位终端。(32位:启动MSYS2 MinGW 32位终端。)

  2. 切换到crate目录。

  3. 使用cargo构建crate。

请注意,您可以通过安装mingw-w64-x86_64-clang(32位:mingw-w64-i686-clang)并设置环境变量CC=clang来在构建crate之前使用Clang代替GCC。

交叉编译

虽然可以进行一些交叉编译,但它们不是自动测试的,并且可能无法正常工作。接受改进交叉编译的合并请求。

对于实验性功能force-cross,必须启用交叉编译。有一种情况即使没有此功能也可以允许:当主机和目标之间的唯一区别是主机是x86_64,而目标是i686。

缓存已构建的C库

构建C库可能需要一些时间。为了节省编译时间,构建的库会按照以下方式缓存在用户的缓存目录中

  • 在GNU/Linux上:位于 $XDG_CACHE_HOME/gmp-mpfr-sys$HOME/.cache/gmp-mpfr-sys
  • 在macOS上:位于 $HOME/Library/Caches/gmp-mpfr-sys
  • 在Windows上:位于 {FOLDERID_LocalAppData}\gmp-mpfr-sys

若要使用不同的目录,可以将环境变量 GMP_MPFR_SYS_CACHE 设置为所需的缓存目录。将 GMP_MPFR_SYS_CACHE 变量设置为空字符串或单个下划线("_")将禁用缓存。

依赖项