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
英文地址,請注明出處:http://en.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(例如訪問數組越界)&…

分享低功耗單火線開關語音識別方案

在眾多老舊建筑和常規家居環境里,單火線布線是主流方式。單火線語音識別芯片方案通過研發和應用特殊的單火線語音識別芯片,實現設備在單火線供電條件下穩定運行,并精準識別語音指令,為智能家居、智能照明等領域帶來便捷的語音控制…