文章目录
- 交叉编译 gmp
- 1 概述
- 2 源码下载
- 2.1 官网下载
- 2.2 使用 apt source 下载
- 3 交叉编译
- 4 关于 DESTDIR 的说明
交叉编译 gmp
1 概述
GMP (GNU Multiple Precision Arithmetic Library) 是一个用于任意精度计算设计的数学库,它的主要目标应用是密码学应用和研究、互联网安全应用、代数系统、计算代数研究等。
GMP 经过精心设计,无论是小操作数还是大操作数,都尽可能快,是一个高性能的数学库。自 1991 年首次发布以来,GMP 还在不断开发和维护,大约每年发布一次新版本。
从版本 6 开始,GMP 在双重许可证下发布(GNU LGPL v3 和 GNU GPL v2),这些许可证使库可以自由使用、共享和改进。
GMP 库提供了丰富的算术运算功能,包括整数运算、有理数运算和浮点运算,这些功能的实现都考虑到了提升性能和精度:
- 整数运算:支持任意精度的整数运算,包括加法、减法、乘法、除法、模运算等。这对于处理大整数计算任务非常重要,如密码学中的大数模运算和幂运算。
- 有理数运算:支持有理数的加减乘除等基本运算,以及有理数的约分和化简。
- 浮点运算:虽然 GMP 主要以整数运算著称,但它也提供了对浮点数的高精度计算功能,支持任意精度的浮点数运算,包括加减乘除、取模和开平方等操作。
综上所述,GNU GMP 库是一个功能强大且高效的数学库,适用于处理大整数和高精度浮点数的计算任务。它的广泛应用领域和卓越性能使其成为科学研究、金融分析和密码学等领域的重要工具。
官方网址: https://gmplib.org/
2 源码下载
2.1 官网下载
在官方网址的入口处其实已经给出了下载链接,点击 Download 后面的版本链接 「gmp-6.3.0.tar.xz」 即可直接下载。在「Download the latest release of GMP」章节,显示了已发布的最新的版本信息及下载链接,选择合适的压缩格式的版本即可。如下图所示:
也可以使用 wget
命令直接下载:
wget https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz
GMP 的历史版本可以在 https://gmplib.org/download/gmp/ 路径下找到。
GMP 的源码没有使用 Git 进行版本管理,它使用的是称为 Mercurial 的版本管理器,在 GMP Repository Usage 中有详细的介绍。
2.2 使用 apt source 下载
如果你使用的是 Ubuntu/Debian 系统,可以使用 apt source
指令进行源码下载。
mkdir libgmp
cd libgmp
apt source libgmp10
此处下载的是与 Ubuntu/Debian 系统版本相符的 GMP 源码,并非最新源码。
3 交叉编译
解压缩源码包,如果使用 apt source
下载回来的源码可以忽略这一步。
tar -xvf gmp-6.3.0.tar.xz
解压缩源码包之后建议先阅读 README 与 INSTALL 文档,里面有关于编译的相关信息。
GMP 支持的是 GNU Build System 编译系统,简单理解就是 Unix 经典编译三步曲:
./configure
make
make install
在进行交叉编译前,首先创建一个环境配置文件 aarch64-environment-setup
,配置最重要的交叉编译环境变量:
aarch64-environment-setup:
export TOOLCHAIN_ROOT=/opt/toolchains/aarch64--glibc--stable-2022.03-1
export BUILDSYSROOT=$TOOLCHAIN_ROOT/aarch64-buildroot-linux-gnu/sysroot
export PATH=$TOOLCHAIN_ROOT/bin:$PATH
export PREFIX=/usr
export CC="aarch64-linux-gcc --sysroot=$BUILDSYSROOT"
export CXX="aarch64-linux-g++ --sysroot=$BUILDSYSROOT"
export CPP="aarch64-linux-gcc -E --sysroot=$BUILDSYSROOT"
export LD="aarch64-linux-ld --sysroot=$BUILDSYSROOT"
export AR=aarch64-linux-ar
export AS=aarch64-linux-as
export NM=aarch64-linux-nm
export GDB=aarch64-linux-gdb
export OBJDUMP=aarch64-linux-objdump
export OBJCOPY=aarch64-linux-objcopy
export RANLIB=aarch64-linux-ranlib
export READELF=aarch64-linux-readelf
export STRIP=aarch64-linux-strip
export CONFIGURE_FLAGS="--host=aarch64-linux --build=x86_64-linux"
export PKG_CONFIG_SYSROOT_DIR=$BUILDSYSROOT
export PKG_CONFIG_PATH=$BUILDSYSROOT/usr/lib/pkgconfig:$BUILDSYSROOT/usr/share/pkgconfig
在本示例中,交叉编译工具位于 /opt/toolchains/aarch64--glibc--stable-2022.03-1/bin
目录下,将该目录配置到 PATH 环境变量,让系统能够正确搜索到。同时在配置 CC,CXX,CPP 与 LD 环境变量时指定 --sysroot=<dir>
参数让交叉编译器搜索 dir 目录下的头文件与库文件,而不是 /usr/include
及 /usr/lib
。
cd gmp-6.3.0
source aarch64-environment-setup
./configure --prefix=/usr $CONFIGURE_FLAGS
make
make DESTDIR=$BUILDSYSROOT install
- 源码包解压后,使用
cd
命令切换到源码路径 - 在源码目录下创建环境设置文件并调用
source
命令让环境变量生效 - 执行源码包的
configure
文件,带上--prefix
参数,指定安装路径。在配置文件中定义了临时的 CONFIGURE_FLAGS 来指定--host
与--build
选项的值,具体的说明可以使用./configure --help
命令进行查阅 - 执行
make
命令编译源码 - 使用 DESTDIR 参数作为安装目标文件的前缀变量,后面带上你希望安装到的文件夹路径,详细介绍可以参考 DESTDIR 官方介绍。
最终你就可以在环境变量定义的 $BUILDSYSROOT
目录中找到交叉编译好的 libgmp 的头文件及库文件。
4 关于 DESTDIR 的说明
DESTDIR 主要用于在安装时重新定位软件包。以下是一个示例说明:
~/amhello-1.0 $ ./configure --prefix /usr
~/amhello-1.0 $ make
~/amhello-1.0 $ make DESTDIR=$HOME/inst install
~/amhello-1.0 $ cd ~/inst
~/inst $ tar zcvf ~/amhello-1.0-i686.tar.gz .
./
./usr/
./usr/bin/
./usr/bin/hello
通过以上操作,~/amhello-1.0-i686.tar.gz
已经准备好部署到任何机器的 /
根目录下了。
Good luck.
欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景