首页 > 系统相关 >rust交叉编译配置:windows上编译linux可执行程序

rust交叉编译配置:windows上编译linux可执行程序

时间:2023-04-25 11:56:29浏览次数:59  
标签:windows unknown cross 编译 linux -- 可执行程序

rust交叉编译配置:windows上编译linux可执行程序

简述

交叉编译大概指在在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码.

本次,我们配置的是在windows上编译出在linux上运行的rust可执行程序.

我们在安装rust之后,默认会安装跟机器环境搭配的编译相关工具.而其他平台的编译工具就需要我们自己去安装了.
通过如下命令查看rust当前的编译工具:

rustup show

查看rust其他支持的编译工具链工具:

rustup target list
# 其中标注了(installed)的表示已安装

其中以gnu为后缀的表示动态编译,即很多包依赖与系统原有的,不打如包中,这可能造成把程序放在某些机器上执行错误的情况,
好处是编译后体积较小.

而以msvc或者musl为后缀的,表示静态编译,即把这个程序相关的代码都打进去,只要执行环境(即编译工具前面的描述x86_64_windows什么的一致)就能执行,
缺点是编译后体积较大.

尝试常规方法配置windows上编译linux的环境遇到各种环境失败之后,决定采用cross方案.

cross介绍

cross仓库地址 :  https://github.com/cross-rs/cross

cross大概步骤就是通过docker起一个你编译目标的环境,然后把代码扔过去编译,完成后把结果放到项目的target目录下.

这种方式,一劳永逸,并且可拓展性很强,不会遇到各种问题.因此决定采用cross.

cross项目地址上也有教程,请留心查看.
其中,cross的使用跟cargo命令相似:

$ cross build --target aarch64-unknown-linux-gnu

$ cross test --target mips64-unknown-linux-gnuabi64

$ cross rustc --target powerpc-unknown-linux-gnu --release -- -C lto

使用步骤

1. 在cargo上安装cross工具

cargo install cross --git https://github.com/cross-rs/cross

2. 安装docker

此处不详细介绍,注意windows和linux安装docker步骤不一样,windows上需要开启某项系统功能.

具体见: https://www.runoob.com/docker/windows-docker-install.html

注意,需要将docker配置为国内镜像源,但是国内镜像有的已经不能使用了,
我目前的配置如下:

"registry-mirrors": [
    "https://5ba5frns.mirror.aliyuncs.com",
    "https://mirror.baidubce.com"
  ]

3. 拉取相关镜像

如果直接就开始使用,默认拉取的是github仓库的镜像,国内环境网速不行,且没有相关国内镜像源,试了若干次,都以卡死告终.

幸好,有人已经拉取成功并上传到其他仓库中,这些仓库包含在我们配置的国内仓库中,因此可以顺利拉取.

使用以下命令拉取:

docker pull japaric/x86_64-unknown-linux-musl

4. 项目中配置cross,指定image

因为我们使用的不是默认的image,所以要在项目中配置说明,在项目Cargo.toml中添加如下:

[package.metadata.cross.target.x86_64-unknown-linux-musl]
image = "japaric/x86_64-unknown-linux-musl"

4. 开始编译

此处就可以开始使用corss编译了,我们的镜像是 x86_64-unknown-linux-musl,
注意指定target,那么在项目中执行如下命令即可:

cross build --release --target x86_64-unknown-linux-musl

标签:windows,unknown,cross,编译,linux,--,可执行程序
From: https://www.cnblogs.com/sqhhh/p/17352177.html

相关文章

  • 虚拟机-windows 修改密码
    1、关机2、备份卷3、手动操作把系统卷挂载到别的vm上4、复制cmd.exe覆盖放大镜的exe文件5、手动卸载6、进入登录页面后点击放大镜的按钮,输入命令重置密码当前密码Tstack@1231.关机[root@openstack‐con01~(keystone_admin)]#novalist‐‐all|grep172.16.0.48|5d356c31‐......
  • 全球首发:Tiny10 2023 x86最终版及类似win10精简版/Win K/N版 单独添加Windows Media P
    情况:1.Windows功能列表中没有媒体功能(MediaFeatures),或该项下没有Windowsmediaplayer选项2.普通在Windows-设置-功能-可选功能中单独可以添加WMP,但实际并无效果,该组件需要相关功能包打开情况下才可以安装成功,否则尽管显示已安装,但实际Program目录下并无WindowsMediaPlayer出......
  • windows找回wifi密码
    1.打开命令提示符,键入netshwlanshowprofiles就像下图2.上述列表中的名称是电脑中存储的所有wifi配置;找到待找回密码的wifi名称,继续输入netshwlanshowprofilename="wifi名称"key=clear安全设置中的关键内容就是wifi密码......
  • 使用RAMMap+PoolMon分析Windows内存异常使用问题
    由于技术能力有限,文章仅能进行简要分析和说明,如有不对的地方,请指正,谢谢......
  • SpringBoot 编译运行时出现 错误: 无 效的目标发行版:1.11 的解决方法
    网上的方法大多是jdk版本不一致问题这里需要修改下所用maven的settings.xml以下贴的图是修改后,原本我这里jdk的版本号全部是1.11 修改以后就可以顺利运行了,乌鱼子......
  • windows+centos+ubuntu多系统环境,ubuntu启动修复
    故障现象:       在windows中调整分区后,ubuntu系统无法启动,centos启动进入保护模式解决过程一、双硬盘,centos硬盘EFI分区还在,ubuntu硬盘EFI分区消失,发现一个300的分区但是不是efi分区,查看分区无数据重建EFI分区fdisk/dev/nvme0n1p1  d删除原有分区n新建分区 ......
  • Windows 7 上安裝 .NET Framework 4.7.2 失敗, 時間戳記簽章及/或憑證無法驗證或格式不
     Windows7上安裝.NETFramework4.7.2失敗,時間戳記簽章及/或憑證無法驗證或格式不正確安装KB2813430补丁;32位系统补丁下载地址:https://www.microsoft.com/zh-CN/download/details.aspx?id=39110 64位系统补丁下载地址:https://www.microsoft.com/zh-CN/download/detai......
  • 【c&c++】C++ 关于编译出现“undefined reference to `std::cout‘“的问题
    1、问题概述        在使用gcc编译c++代码时会出现undefinedreferenceto`std::cout',如编译如下代码:#include<iostream>usingnamespacestd;intmain(){cout<<"Helloworld!";return0;}然而,gcc下编译出现的问题是: 2、解决方法使用g++编译,g++......
  • Natasha 高级编译类 (五)- 第一部分
    模板类的使用,类似于Lambda类名作用命名空间操作类型NAssembly快速创建同程序集的oop及委托等操作类全局静态初始化,动态实例化NInstance根据类型,提供一个初始化实例的委托全局静态NDelegate快速创建指定域的Action/Func委托全局静态初始化,动态......
  • Windows更新失败(0x8007000d)
    “管理员:命令提示符”窗口中,键入以下命令。在每项命令后按Enter键:DISM.exe/Online/Cleanup-image/ScanhealthDISM.exe/Online/Cleanup-image/Restorehealth要关闭“管理员:命令提示符”窗口,请键入Exit,然后按Enter。再次运行Windows更新。......