Rust在CentOS 6上的移植

Rust已不支持Cent OS 6

rhel是Redhat 发布的Red Hat Enterprise Linux的简称,使用rhel源代码编译的CentOS,最新的版本是CentOS 7,于2024年停止支持。而更古老的CentOS 6,则在2020年就已经结束了。

而面对如此老旧的系统,Rust官方则早就放弃了支持。

按照rust官网上的安装方法,执行:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

会首先返回一个curl不支持--proto,把这行删掉再执行,成功下载了rustup.rs,则会直接失败在不支持的glibc版本这一步上。

通过2022年8月1日这则blog,我们知道Rust已经从1.64版本开始,明确放弃了对glibc 2.17版本、linux 3.2版本之下的支持(以前的版本是glibc 2.11、linux 2.6.32)。

而Cent OS 6的glibc的版本是2.12.1,linux的版本是2.6.32。所以,我们只能选择rust 1.63版本。

安装 Rust 1.63

好在Rust很良心地提供了各平台安装包,在归档里就有Rust 1.63。

因为是Linux系统,我们选择x86_64-unknown-linux-gnu下载,放到Cent OS 6系统上。

解压开之后,会有一个install.sh。执行完之后,1.63版本的Rust就安装好了。

默认地,它会安装在/usr/local目录里,所以我们熟悉的cargo、rustc、rustfmt等命令,都会在/usr/local/bin目录里。如果/usr/local/bin没有在PATH环境变量的,需要加一下。

如:

export PATH=/usr/local/bin:$PATH

gcc 4.8

如果我们使用的crates也都比较老旧,这时候在CentOS 6上已经可以“比较顺畅”地使用Rust开发了。

但是,现在毕竟已经是2025年了,C++已经经过了C++ 11、C++ 14、C++ 17、C++ 20以及C++ 23,就要发布C++ 26了。而CentOS 6上的gcc 还是4.4.7,连C++ 11都不支持。

好在Redhat提供了devtoolset。对于Cent OS 6来说,最简单方便地使用devtoolset 的方法,就是直接在/etc/yum.repos.d里,手动增加一个devtoolset 2的repo文件。

[devtools-2-centos-$releasever]  
name=devtools 2 for CentOS $releasever    
baseurl=http://people.centos.org/tru/devtools-2/$releasever/$basearch/RPMS  
gpgcheck=0

然后运行yum repolist,就会增加一个repo,名字叫做devtoolset 2 for CentOS 6,我们执行yum search devtoolset,可以看到gcc、gdb、valgrind等一系列开发工具,甚至包括Emacs,都有了devtoolset 2的定制版本。

我们安装yum install devtoolset-2-gcc之后,会发现这些东西安装在了目录/opt/rh/devtoolset-2/root里面。

为了方便,我们可以把原来的gcc备份一下,然后建一个新的软连接,连接到devtoolset-2的gcc。

mv /usr/bin/gcc /usr/bin/gcc-4.4.7
ln -s /opt/rh/devtoolset-2/root/usr/bin/gcc /usr/bin/gcc

之后执行gcc -v,就可以看到gcc 已经升级到4.8.2版本了。

虽然gcc 4.8也已经被放弃支持了,但是毕竟它支持std=c1x啊。

rustup 切换到1.63

如果我们已经不习惯在古老的CentOS 6系统里面开发,其实我们可以进行交叉开发。

即,在一个比较新的系统里,使用rust 1.63进行开发,然后再把代码放到CentOS 6里面进行编译。

得益于rustup的生态,进行这项工作非常简单。

首先,使用rustup安装1.63版本。

rustup intall 1.63.0

其次,在我们需要使用低版本rust的项目里执行:

rustup override set 1.63.0

之后就可以舒服的在高版本的Linux里开发低版本的rust程序了。

如果切换之后,提示

error: failed to parse lock file at: /home/p/Nutstore/jt/bjagent_gbjt/Cargo.lock  Caused by:  lock file version `4` was found, but this version of Cargo does not understand this lock file, perhaps Cargo needs to be updated?

就是当前的rust版本不支持Cargo.lock文件的格式,备份之后删除重试就行。

cargo 依赖

在使用rust 1.63的过程中,我还发现几个对我造成了困扰,但是其实又比较有意思的地方。

  • cargo缓存的包会影响cargo程序运行

我的项目里面依赖了fastdate这个crate,这个crate依赖的Rust版本是2024,于是在我使用了rust 1.63的项目目录下面,连执行cargo tree解析依赖树都解析不了,直接停止在rust不能解析fastdate 的Cargo.toml里的editon=2024这句。

即使我在Cargo.toml里面指定使用较低版本的fastdate,仍然解决不了这个问题。cargo仍然会解析高版本的fastdate,然后停止。

我是把.cargo/registry/src/目录中的fastdate源码改了,才可以执行出来cargo tree,进而发现是其它包间接依赖高版本的fastdate,才最终在项目上解决这个问题。

  • cargo解决依赖关系的时候,会使用最新版本。

比如,你的项目里面使用了一个crate叫做a,因为比较新的a需要Rust 1.64,于是你使用了比较旧的a版本,并且在Carto.toml里使用

[dependencies]
a = "=old"

严格限制了版本号。

但是,如果a依赖了b,cargo在构建的时候,仍然会选择较新版本的b来构建。

于是构建失败。

其实解决方法也很简单,就是在Cargo.toml里,明确指定b的版本号。

  • cargo提供了一个minimal-versions 工具。

执行cargo install cargo-minimal-versions安装,之后执行

cargo minimal-versions check或者cargo minimal-versions build来测试或者构建。

但是,其实这个命令还依赖cargo-hack工具,需要再安装cargo install cargo-hack

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

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

相关文章

C++音视频开发:基础面试题

音视频领域技术门槛高,学习资料稀缺,体系化书籍和开发工具有限,新手入门困难。音视频开发涉及众多任务:音频(采集、编解码、降噪等)、视频(采集、编解码、图像处理)、实时传输&#…

C++刷题 - 7.27

贪心算法的详细逻辑这个问题的最优解可以用 贪心算法 在 O(N) 时间 内解决。它的核心思想是:每次操作尽可能覆盖最长的连续非零区间,并通过数学分析发现:最小操作次数等于所有“上升台阶”的高度差之和。1. 直观理解假设 steps [1, 2, 3, 2,…

音频3A处理简介之AGC(自动增益控制)

在音频通话和视频会议中,音频自动增益控制AGC模块的主要作用:• 稳定音频信号的输出电平。无论麦克风采集信号的强弱(如用户离麦克风远近程度不同),尽可能保证音频采集模块的输出音量保持相对一致,不会偏大…

web前端打包apk包

我用的是HBuilder工具,可视化更便捷,目前我这操作的apk包是不需要上架的,所以跟实际需要上架的可能还有些出入 首先先新建个项目,选择5App模式 把目前需要打包的内容上传到服务器,我们以嵌套的形式进行打包,找到index.…

Ansible提权sudo后执行报错

1.问题 配置了sudo提权信息后,执行ansible-play报错,报错信息如下:2.原因 sudo没有执行**/bin/sh的权限,而ansible脚本中依赖/bin/sh**,所以报错了: 查看日志sudo tail -f /var/log/secure3.解决方式 修改*…

.NET报表控件ActiveReports发布v19.0——正式兼容 .NET 9

ActiveReports 是一款专注于 .NET 和 .NET Core 平台的报表控件。通过拖拽式报表设计器,可以快速地设计 Excel表格、Word文档、图表、数据过滤、数据钻取、精准套打等类型报表,全面满足 WinForm、ASP.NET、ASP.NET MVC、WPF 平台中各种报表的开发需要。同…

SCI论文选词炼句

标准句子不能啰嗦;词不能有问题,得是SCI中经常出现的,符合上下文的。SCI论文中常出现的摸棱两可的词单词涵义例子Architecture指 整体系统设计方案,如网络层次结构、模块组合、激活函数选择等深度学习模型架构Structure更泛泛&…

Qt deleteLater 延迟删除原理

deleteLater 调用 事件发送 void QObject::deleteLater() {QCoreApplication::postEvent(this, new QDeferredDeleteEvent()); }首先该对象继承QObject调用deleteLater, 内部会发送删除事件QCoreApplication::postEvent(this, new QDeferredDeleteEvent()) 到事件循…

TypeScript SDK 升级:通过 Upload Relay 赋能更多应用

自 3 月主网上线以来,Walrus 开发者社区持续展现出强劲的发展势头: 当前 Walrus 已存储超 758 TB 数据,为数百个项目提供支持。在 2025 年 6 月举办的 Sui Overflow 黑客松上,Walrus 成为最受欢迎的数据层。该赛事共收到 599 个项…

C#线程同步(二)锁

目录 1.lock 2.Monitor 3.锁的其它要注意的问题 3.1同步对象的选择 3.2什么时候该上锁 3.3锁和原子性 3.4嵌套锁 3.5 死锁 3.6 性能 4.Mutex 5.Semaphore 1.lock 让我们先看一段代码: class ThreadUnsafe {static int _val1 1, _val2 1;static void G…

鸿蒙智能居家养老系统构思(续二)—— 适老化烹饪中心详细构思

一、背景在“写给华为鸿蒙智家 —— 智能居家养老系统构思”一文中,结合对居家养老的理解及个人体验,提出了基于鸿蒙OS实现居家养老系统的粗略构思。其中包含“吃得好”。当老人到了不能随性外出活动、只能在家消耗时光时,除了一些看看电视、…

高斯透镜公式(调整镜头与感光元件之间的距离时,使得不同距离的物体在感光元件上形成清晰的影像)

当使用定焦镜头时,仍然可以调整镜头与感光元件(或胶片)之间的距离时,使得不同距离的物体在感光元件上形成清晰的影像。对此可以用高斯透镜公式进行解释: 一、透镜成像的基本原理 在光学中,一个基本的公式是…

预过滤环境光贴图制作教程:第三阶段 - GGX 分布预过滤

核心目标 GGX 分布是 PBR 中模拟粗糙表面高光反射的主流模型,其核心是通过统计分布描述微表面的朝向概率。本阶段的目标是: 基于第一阶段生成的环境图集,预计算 6 个级别的 GGX 过滤结果(对应不同粗糙度); 使用蒙特卡洛采样(Monte Carlo Sampling)加速 GGX 卷积计算;…

Spring框架与AutoCAD结合应用

什么是AutoCAD? AutoCAD简介 AutoCAD是由美国Autodesk公司开发的计算机辅助设计(CAD)软件,广泛应用于建筑、工程、制造、产品设计等领域。它支持2D绘图和3D建模,提供精确的图形工具和自动化功能,帮助用户高效创建技术图纸和模型。 主要功能 2D绘图:提供直线、圆弧、多…

Java 学习笔记:常用类、String 与日期时间处理

作为一名名 Java 初学者,最近在学习过程中整理了一些关于常用类、String 类以及日期时间处理的知识点。这些内容是 Java 基础中的重点,也是日常编程练习中频繁用到的工具,掌握它们能让我们在写代码时更加得心应手。今天把这些笔记分享出来&am…

Android常用的adb和logcat命令

ADB ADB,即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令&…

重学JS-001 --- JavaScript算法与数据结构(一)JavaScript 基础知识

文章目录 变量 变量命名规则 变量命名 let vs const 变量使用范围 赋值 = 控制台输出 运算符 ++ -- == === !== 注释 转义字符 数据类型 7种 原始数据类型 1. string​​ 2. number​​ 3. ​​boolean​​ 4. null​​ 5. undefined​​ 6. ​​symbol​​(ES6 新增) 7. big…

MySQL数据闪回工具my2sql的使用

场景: 当你或者其它人员误操作数据库不小心删除或者更新了一批数据,但是是当时又没事先备份时,你可以 用这个 my2sql工具快速帮你找回数据。就是如此的丝滑。但是要注意的是只限于dml语句,所以我们在操作数据库前必需先备份哦&…

9.1无法恢复的错误与 panic!

无法恢复的错误与 panic! 有时你的代码中会发生严重问题,而你无能为力。在这些情况下,Rust 提供了 panic! 宏。实际上,有两种方式会导致 panic:一种是执行某个操作使代码产生 panic(例如访问数组越界)&…

分享低功耗单火线开关语音识别方案

在众多老旧建筑和常规家居环境里,单火线布线是主流方式。单火线语音识别芯片方案通过研发和应用特殊的单火线语音识别芯片,实现设备在单火线供电条件下稳定运行,并精准识别语音指令,为智能家居、智能照明等领域带来便捷的语音控制…