交叉编译 gmp

news/2024/9/19 0:38:21/ 标签: gmp, cross compile

文章目录

  • 交叉编译 gmp
    • 1 概述
    • 2 源码下载
      • 2.1 官网下载
      • 2.2 使用 apt source 下载
    • 3 交叉编译
    • 4 关于 DESTDIR 的说明

gmp_2">交叉编译 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:$PATHexport PREFIX=/usrexport 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-stripexport 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 环境变量,让系统能够正确搜索到。同时在配置 CCCXXCPPLD 环境变量时指定 --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.

欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景


http://www.ppmy.cn/news/1519740.html

相关文章

PHP:构建高效动态网页的基石

PHP:构建高效动态网页的基石 在当今的互联网世界中,PHP作为一种服务器端脚本语言,依然占据着不可替代的地位。自1995年诞生以来,PHP凭借其简洁的语法、丰富的功能和广泛的数据库支持,成为了开发动态网页和Web应用的首选语言之一。本文将深入探讨PHP的核心优势、最新发展动…

内存管理篇-20 Linux虚拟内存管理

1.虚拟地址的经典布局 这里的内容比较少。只要就是内核用户空间的划分。内核空间又有自己的划分。也需要注意一下每个区域的性能。理论上线性映射是最简单的&#xff0c;所以性能最高。同时&#xff0c;注意内核空间是可以配置的&#xff0c;并不是都3:1。 2.ARM32下的内存…

android 离线的方式使用下载到本地的gradle

1、android studio在下载gradle的时候&#xff0c;特别慢&#xff0c;有的时候会下载不完的情况&#xff0c;这样我们就要离线使用了。 2、下载Gradle Gradle | Releases 或者 Releases gradle/gradle GitHub Gradle | Releases 这里我们下载8.10 complete版本&#xff0c…

数据库(MySQL)的基本操作

1.简介 &#xff08;1&#xff09;数据库 1.数据库&#xff08;Data Base&#xff0c;简称DB&#xff09;&#xff1a;长期保存在计算机的存储设备上&#xff0c;数据是按照一定的规则组织起来的&#xff0c;能被用户、应用平台共享的数据集合。&#xff08;存储、维护和管理…

C++使用日志库经验总结

1、log4cpp日志源文件路径设置 在 Visual Studio 中&#xff0c;C 项目的日志格式可以通过设置项目的属性来调整。如果你想要使用完整路径来显示诊断消息&#xff0c;可以在项目属性中的“C/C”选项卡下的“高级”属性页中找到“使用完整路径”&#xff08;/FC&#xff09;选项…

【设计模式】详细解释工厂模式和策略模式的区别,并给出形象生动的示例说明

工厂模式&#xff08;Factory Pattern&#xff09;和策略模式&#xff08;Strategy Pattern&#xff09;都是设计模式中的重要概念&#xff0c;它们用于解决不同的设计问题。下面我会详细解释它们的区别&#xff0c;并给出示例。 工厂模式 定义&#xff1a; 工厂模式是一种创…

outlook在“对我发送的邮件应用规则”时只能移动邮件副本的问题和解决方案

outlook在“对我发送的邮件应用规则时”只能移动邮件副本的问题 问题描述问题的解决方案第一步第二步 其他说明参考 问题描述 如果我们想对自己发送的邮件进行分类&#xff0c;可以使用规则将已发送的邮件移动到指定文件夹中&#xff0c;但是。当操作对象为“自己发送的邮件时…

3. MyBatis 执行原理了解吗?

MyBatis 是一个半自动化的持久层框架&#xff0c;它通过配置文件或注解将 SQL 语句与 Java 对象进行映射&#xff0c;从而简化数据库访问操作。MyBatis 的执行原理涉及多个核心组件和步骤&#xff0c;以下是对 MyBatis 执行原理的详细说明&#xff1a; 1. MyBatis 的核心组件 S…

MFC工控项目实例之八选择下拉菜单添加打钩图标

承接专栏《MFC工控项目实例之七点击下拉菜单弹出对话框》 具体添加菜单栏参考我的博客文章《MFC工控项目实例之七点击下拉菜单弹出对话框》 这里只给出相关代码 1、在SEAL_PRESSUREDlg.h文件中添加代码 class CSEAL_PRESSUREDlg : public CDialog { // Construction public:..…

PMP核心知识点—之项目运行环境

知识点1&#xff1a;项目合规性 不合规的项目就不应该做。 知识点2&#xff1a;项目影响两大因素 组织过程资产、事业环境因素 知识点3&#xff1a;职能型以及项目型组织结构 知识点4&#xff1a;矩阵型组织结构 弱矩阵—平衡矩阵—强矩阵 (项目经理权力的强弱) 知识点5&am…

开放式耳机的优缺点?音质好吗?分享四款开放式蓝牙耳机

作为蓝牙耳机的重度使用患者&#xff0c;我认为开放式耳机音质的好坏取决的因素有好多&#xff0c;包括不同的品牌、不同的‌型号及不同的产品所采用的声学技术&#xff0c;而且开放式耳机的音质好不好也是取决使用者的需求的&#xff0c;有些开放式耳机能提供更清晰的人声音频…

PostgreSQL技术内幕3:PG逻辑存储层级和物理存储结构

目录 0.概述1.PG数据组织&#xff08;逻辑包含关系&#xff09;2.存储目录3.文件布局4.页内数据存储和TOAST策略 0.概述 本篇用来介绍PG存储的逻辑层级关系&#xff0c;database->schema,到schema中可以存在的各种信息&#xff0c;像table&#xff0c;索引等&#xff08;理…

谷歌浏览器与edge哪个好用

浏览器是我们工作和生活中的重要工具&#xff0c;其中谷歌浏览器与edge是两款备受关注的浏览器工具。那么这二者中&#xff0c;哪一款更胜一筹呢&#xff1f;本文将比较这两款浏览器的功能、性能和用户体验等&#xff0c;帮助大家做出明智的选择。 谷歌浏览器的历史与发展&…

高级java每日一道面试题-2024年9月01日-基础篇-事务的四个特性(ACID)分别是什么?

如果有遗漏,评论区告诉我进行补充 面试官: 事务的四个特性&#xff08;ACID&#xff09;分别是什么&#xff1f; 我回答: 事务的四个特性&#xff08;ACID&#xff09;是经常被提及的重要概念&#xff0c;特别是在处理数据库操作时。ACID代表原子性&#xff08;Atomicity&am…

华为管理工程与管理工程部

我们经常讲管理是一项系统工程&#xff0c;但在企业实际的管理建设和改进中&#xff0c;往往又并没有把管理当作一项系统工程来对待。在这方面&#xff0c;汉捷咨询董事长胡红卫先生认为华为的做法和经验值得企业借鉴。 华为管理工程部成立的背景 1996年初&#xff0c;华为公…

Linux:网络编程之TCP/IP模型,UDP协议

一、OSI模型七层结构 OSI&#xff08;Open Systems Interconnection&#xff09;模型&#xff0c;即开放系统互连参考模型&#xff0c;是一个概念性框架&#xff0c;用于促进全球通信。它定义了网络通信的七层结构&#xff0c;每一层都执行特定的功能&#xff0c;并且每一层都使…

Driver.js——实现页面引导

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

秋招/春招投递公司记录表格

最近在准备秋招&#xff0c;在各个平台投递秋招简历&#xff0c;什么官网&#xff0c;邮箱&#xff0c;boss&#xff0c;应届生各个平台上&#xff0c;投递的平台比较多&#xff0c;比较乱&#xff0c;因此自己想将这些平台投递记录都收集到一个表格上&#xff0c;所以在腾讯文…

基于 R 语言的深度学习——简单回归案例

近年来深度学习在人工智能领域飞速发展&#xff0c;各行业的学者、研究人员纷纷涌入研究热潮。本文将从 R 语言角度来介绍深度学习并解决以下几个问题&#xff1a; 什么是深度学习&#xff1f; 相关深度学习包有哪些&#xff1f; 如何配置工作环境&#xff1f; 如何使用神经…

gitignore does not work

在.gitignore文件中新增想要ignore的文件路径&#xff0c;但是不生效。 这是由于git cache导致的&#xff0c;处理方法见下方链接&#xff1a; caching - Ignore files that have already been committed to a Git repository - Stack Overflow