最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

rust交叉編譯問題及報(bào)錯(cuò)解析

 更新時(shí)間:2023年07月19日 11:40:53   作者:龔正陽  
這篇文章主要為大家介紹了rust交叉編譯問題及報(bào)錯(cuò)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

rust交叉編譯

純粹的rust代碼是很容易實(shí)現(xiàn)交叉編譯,但是使用到的庫中如果使用到C/C++,編譯就會(huì)比較復(fù)雜,直接運(yùn)行交叉編譯命令如下,可能直接報(bào)錯(cuò)

$ cargo build -r --target aarch64-apple-darwin

交叉依賴于項(xiàng)目https://github.com/cross-rs/cross

利用docker簡化了在x86_64linux操作系統(tǒng)上進(jìn)行交叉編譯時(shí)所需要的前置設(shè)置

安裝

$ cargo install cross

該項(xiàng)目需要依賴docker或者podman

獲取鏡像的時(shí)候由于是直接拉ghcr.io/cross-rs/*的鏡像,所以國內(nèi)配置的鏡像是無法使用的,這個(gè)時(shí)候需要配置docker的代理服務(wù)才行

查看docker服務(wù)配置文件位置

$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)

依據(jù)上面命令輸出,修改文件/lib/systemd/system/docker.service配置HTTP代理,代理的參數(shù)值需要依據(jù)自己代理而調(diào)整

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:20171"
Environment="HTTPS_PROXY=http://127.0.0.1:20171"

重啟服務(wù)

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

執(zhí)行交叉編譯

使用的時(shí)候需要把cargo替換為cross命令

$ cross build -r --target x86_64-pc-windows-gnu

執(zhí)行的時(shí)候會(huì)自動(dòng)拉取一個(gè)鏡像ghcr.io/cross-rs/x86_64-pc-windows-gnu:{version}version參數(shù)的值是默認(rèn)依據(jù)cross的版本號(hào)定的,比如執(zhí)行命令如下,發(fā)現(xiàn)版本號(hào)是0.2.5,則對(duì)應(yīng)的獲取鏡像是ghcr.io/cross-rs/x86_64-pc-windows-gnu:0.2.5

$ cross --version
cross 0.2.5
[cross] note: Falling back to `cargo` on the host.
cargo 1.68.0 (115f34552 2023-02-26)

編譯時(shí)候的報(bào)錯(cuò)解決

該錯(cuò)誤一般會(huì)出現(xiàn)在rust以及第三方庫版本非常新,但是cross的版本是比較久之前發(fā)布的

目前cross的版本是0.2.5,對(duì)應(yīng)的tag值也是一樣

編譯過程當(dāng)中會(huì)出現(xiàn)如下錯(cuò)誤,表示找不到某個(gè)GLIBC版本

error: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /target/release/deps/libfutures_macro-7a167e0564403030.so)

查看容器基礎(chǔ)鏡像信息

$ docker run ghcr.io/cross-rs/x86_64-pc-windows-gnu:0.2.5 cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
...
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

查看支持的GLIBC版本信息

$ docker run ghcr.io/cross-rs/x86_64-pc-windows-gnu:0.2.5 strings /lib/x86_64-linux-gnu/libc.so.6|grep GLIBC
GLIBC_2.2.5
....
GLIBC_2.24
GLIBC_2.25
GLIBC_2.26
GLIBC_2.27
GLIBC_PRIVATE
GNU C Library (Ubuntu GLIBC 2.27-3ubuntu1.6) stable release version 2.27.

解決步驟

  • 切換到項(xiàng)目https://github.com/cross-rs/crosstag v0.2.5查看文件cross/docker/Dockerfile.x86_64-pc-windows-gnu發(fā)現(xiàn)第一行確實(shí)是FROM ubuntu:18.04
  • 這個(gè)時(shí)候?yàn)g覽器直接訪問地址ghcr.io/cross-rs/x86_64-pc-windows-gnu,會(huì)跳轉(zhuǎn)到https://github.com/cross-rs/cross/pkgs/container/x86_64-pc-windows-gnu
  • 發(fā)現(xiàn)鏡像的tag列表當(dāng)中存在edge或者main,鏡像很新,對(duì)應(yīng)的是main分支的鏡像,一般使用這種tag的鏡像基本可以解決99%GLIBC版本找不到的問題,雖然不是release版本的tag,但是rust的程序只要可以成功編譯出來,就基本不用有什么執(zhí)行問題的,可以放心使用

在項(xiàng)目根目錄下面(與Cargo.toml同級(jí))創(chuàng)建一個(gè)文件Cross.toml寫入如下

[target.x86_64-pc-windows-gnu]
image = "ghcr.io/cross-rs/x86_64-pc-windows-gnu:edge"

之后再次執(zhí)行編譯就會(huì)使用最新的edge鏡像了

$ cross build -r --target x86_64-pc-windows-gnu

交叉編譯蘋果系列

下面采用target aarch64-apple-darwin作為示范

原因

出于版權(quán)原因,cross項(xiàng)目未提供ios/darwin相關(guān)的容器鏡像,所以需要自己構(gòu)建鏡像

版權(quán)說明查看地址https://github.com/cross-rs/cross-toolchains#apple-targets

cross還是提供了部分macos/apple相關(guān)的鏡像制作的代碼,后續(xù)所有操作版權(quán)問題要自己負(fù)責(zé)

clone項(xiàng)目

$ git clone https://github.com/cross-rs/cross
$ cd cross
$ git submodule update --init --remote

其他依賴的倉庫

cross的打包編譯蘋果的時(shí)候需要使用到如下倉庫,用來生成macos cross toolchain和其他一些操作, 該倉庫僅作了解

https://github.com/tpoechtrager/osxcross

交叉編譯的時(shí)候需要傳遞docker build-arg參數(shù),MACOS_SDK_DIR和MACOS_SDK_FILE 或者傳遞一個(gè)單獨(dú)的MACOS_SDK_URL參數(shù),該參數(shù)是蘋果的構(gòu)建包數(shù)據(jù)信息,這個(gè)時(shí)候可以選擇自己整臺(tái)MACOS去獲取MACOS_SDK包,也可以通過第三方倉庫獲取Macos-sdk

https://github.com/phracker/MacOSX-SDKs

在倉庫的release下查找打包好的sdk,下面我會(huì)使用macos-11.1-sdk作為MACOS_SDK_URL的參數(shù)

https://github.com/phracker/MacOSX-SDKs/releases/download/11.0-11.1/MacOSX11.1.sdk.tar.xz

修改dockerfile

進(jìn)入到剛剛的cross倉庫下面,找到文件docker/cross-toolchains/docker/Dockerfile.x86_64-apple-darwin-cross

由于鏡像構(gòu)建過程中會(huì)有大量的git clone, curl等網(wǎng)絡(luò)操作,國內(nèi)環(huán)境需要配置一下代理,在FROM下面一行增加代理信息

ENV HTTP_PROXY=http://*****:**
ENV HTTPS_PROXY=http://{IP}:{端口}

修改MACOS_SDK_URL參數(shù)改為

ARG MACOS_SDK_URL="https://github.com/phracker/MacOSX-SDKs/releases/download/11.3/MacOSX11.3.sdk.tar.xz"

docker組件依賴

交叉編譯需要使用到docker buildx,這個(gè)非常重要,是能夠打包新cross docker鏡像的關(guān)鍵,由于buildx還處于實(shí)驗(yàn)期,一直不是很穩(wěn)定,所以需要配置docker開啟該功能

修改~/.docker/config.json,增加一行

{
    ...
    "experimental": "enabled"
    ...
}

校驗(yàn)是否啟用, 如下,Experimental: true表示配置成功

$ docker version
Client: Docker Engine - Community
 Version:           20.10.17
 API version:       1.41
 Go version:        go1.17.11
 Git commit:        100c701
 Built:             Mon Jun  6 23:02:57 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

檢查buildx版本

$ docker buildx version
github.com/docker/buildx v0.** ***********

開始構(gòu)建,構(gòu)建完成之后會(huì)生成一個(gè)鏡像aarch64-apple-darwin-cross:local

$ cargo build-docker-image aarch64-apple-darwin-cross --tag local

如果遇到報(bào)錯(cuò),如下,看提示和建議信息好像是說buildx未被安裝,解決方案也是配置環(huán)境變量CROSS_CONTAINER_ENGINE_NO_BUILDKIT=1不使用buildx

error: failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create LLB definition: unexpected status code [manifests 20.04]: 403 Forbidden
......
Location:
   /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/convert/mod.rs:727

Warning: call to docker failed
Suggestion: is `buildx` available for the container engine?
Note: disable the `buildkit` dependency optionally with `CROSS_CONTAINER_ENGINE_NO_BUILDKIT=1`

這個(gè)時(shí)候要淡定,不接受他的建議

先嘗試去訪問buildx倉庫如下,獲取最新的一個(gè)release版本

https://github.com/docker/buildx

比如現(xiàn)在獲取到的最新的buildx的下載鏈接

https://github.com/docker/buildx/releases/download/v0.11.0/buildx-v0.11.0.linux-amd64

下載之后按照buildx倉庫readme的提示,替換原來的docker-buildx

linuxdocker plugin的可能位置有

  • /usr/local/lib/docker/cli-plugins OR /usr/local/libexec/docker/cli-plugins
  • /usr/lib/docker/cli-plugins OR /usr/libexec/docker/cli-plugins

像我的Ubuntu22機(jī)器就是執(zhí)行如下命令

$ sudo mv buildx-v0.11.0.linux-amd64 /usr/libexec/docker/cli-plugins/docker-buildx
$ sudo chmod a+x /usr/libexec/docker/cli-plugins/docker-buildx

執(zhí)行完成之后再檢查buildx版本,一般buildx運(yùn)行的時(shí)候是會(huì)遇到很多問題的,該工具也還在實(shí)驗(yàn)中,也一直在不斷進(jìn)行更新修復(fù),所以使用最新版本大概率可以解決問題

$ docker buildx version
github.com/docker/buildx v0.11.0 687feca9e8dcd1534ac4c026bc4db5a49de0dd6e

最后再次執(zhí)行鏡像構(gòu)建

$ cargo build-docker-image aarch64-apple-darwin-cross --tag local

如果還是報(bào)錯(cuò)再接受建議,執(zhí)行命令如下,不使用buildx

$ CROSS_CONTAINER_ENGINE_NO_BUILDKIT=1 cargo build-docker-image aarch64-apple-darwin-cross --tag local

創(chuàng)建Cross.toml

[target.aarch64-apple-darwin]
image = "ghcr.io/cross-rs/aarch64-apple-darwin-cross:local"

執(zhí)行命令如下就完成交叉編譯了

$ cross build --target aarch64-apple-darwin -r

參考閱讀

cross官方github readme

以上就是rust交叉編譯問題及報(bào)錯(cuò)解析的詳細(xì)內(nèi)容,更多關(guān)于rust交叉編譯的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在Rust中編寫自定義Error的詳細(xì)代碼

    在Rust中編寫自定義Error的詳細(xì)代碼

    Result<T, E> 類型可以方便地用于錯(cuò)誤傳導(dǎo),Result<T, E>是模板類型,實(shí)例化后可以是各種類型,但 Rust 要求傳導(dǎo)的 Result 中的 E 是相同類型的,所以我們需要編寫自己的 Error 類型,本文給大家介紹了在Rust中編寫自定義Error的詳細(xì)代碼,需要的朋友可以參考下
    2024-01-01
  • Rust?搭建一個(gè)小程序運(yùn)行環(huán)境的方法詳解

    Rust?搭建一個(gè)小程序運(yùn)行環(huán)境的方法詳解

    rust是一門比較新的編程語言,2015年5月15日,Rust編程語言核心團(tuán)隊(duì)正式宣布發(fā)布Rust?1.0版本,本文給大家介紹Rust?搭建一個(gè)小程序運(yùn)行環(huán)境,以iOS?為例介紹開發(fā)環(huán)境的準(zhǔn)備,感興趣的朋友跟隨小編一起看看吧
    2022-05-05
  • Rust cargo 命令行工具使用示例教程

    Rust cargo 命令行工具使用示例教程

    cargo 是 Rust 的構(gòu)建系統(tǒng)和包管理器,負(fù)責(zé)創(chuàng)建項(xiàng)目、編譯代碼、管理依賴、運(yùn)行測試等,是日常開發(fā)中最常用的工具,這篇文章主要介紹了Rust cargo 命令行工具使用教程,需要的朋友可以參考下
    2025-04-04
  • rust流程控制的具體使用

    rust流程控制的具體使用

    在Rust中,控制流包括條件語句、循環(huán)和匹配模式等,用于實(shí)現(xiàn)程序的邏輯和流程控制,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2023-12-12
  • Rust路由匹配與參數(shù)提取從 match 語句到 axum 的類型魔法

    Rust路由匹配與參數(shù)提取從 match 語句到 axum 的類型魔法

    本文將深入探討 Rust生態(tài)中路由匹配與參數(shù)提取的實(shí)現(xiàn)機(jī)制,我們將從路由的基本概念出發(fā),逐步過渡到現(xiàn)代Rust Web 框架 axum 的實(shí)戰(zhàn),感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • 一文帶你掌握Rust中的字符串與切片

    一文帶你掌握Rust中的字符串與切片

    字符串與切片是所有新手遇到的第一個(gè)門檻,不同于?Java、Python?等語言對(duì)字符串的高度封裝,Rust?的字符串與切片深度綁定了所有權(quán)、借用、生命周期與?UTF-8?編碼,下面小編就和大家詳細(xì)介紹一下吧
    2026-03-03
  • Rust 函數(shù)詳解

    Rust 函數(shù)詳解

    函數(shù)在 Rust 語言中是普遍存在的。Rust 支持多種編程范式,但更偏向于函數(shù)式,函數(shù)在 Rust 中是“一等公民”,函數(shù)可以作為數(shù)據(jù)在程序中進(jìn)行傳遞,對(duì)Rust 函數(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-11-11
  • Rust捕獲全局panic并記錄進(jìn)程退出日志的方法

    Rust捕獲全局panic并記錄進(jìn)程退出日志的方法

    本文提供了捕獲全局panic并記錄進(jìn)程退出日志的方法,首先使用 panic::set_hook 注冊(cè)異常處理及panic 觸發(fā)異常,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • 詳解Rust中的workspace

    詳解Rust中的workspace

    這篇文章主要向大家介紹Rust中的workspace,主要內(nèi)容包括基礎(chǔ)應(yīng)用、實(shí)用技巧、原理機(jī)制等方面,這個(gè)概念在Rust中是通用的,只不過maven換成了cargo,而模塊變成了crate,下面跟著小編通過一個(gè)例子給大家介紹下
    2022-03-03
  • 使用Rust采集天氣預(yù)報(bào)信息并實(shí)現(xiàn)實(shí)時(shí)更新數(shù)據(jù)功能

    使用Rust采集天氣預(yù)報(bào)信息并實(shí)現(xiàn)實(shí)時(shí)更新數(shù)據(jù)功能

    Rust作為一種高效、安全的編程語言,可以用于開發(fā)各種應(yīng)用,包括天氣預(yù)報(bào)采集系統(tǒng),本文將探討如何使用Rust來采集天氣預(yù)報(bào)信息,并實(shí)現(xiàn)實(shí)時(shí)更新數(shù)據(jù)的功能,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01

最新評(píng)論

潮安县| 三原县| 鄱阳县| 肃南| 开鲁县| 湖北省| 蒙山县| 田林县| 龙里县| 眉山市| 太康县| 庆元县| 塔河县| 彰化县| 定结县| 井研县| 遂平县| 铁岭市| 八宿县| 武鸣县| 通州区| 仁布县| 荥阳市| 秀山| 昆明市| 全椒县| 东乌| 洪湖市| 阿拉尔市| 富顺县| 门头沟区| 大悟县| 伊金霍洛旗| 双鸭山市| 汉中市| 确山县| 米林县| 卢龙县| 绍兴县| 南川市| 曲周县|