rust交叉编译配置:windows上编译linux可执行程序(代码片段)

sqhhhhAA111i sqhhhhAA111i     2023-04-25     158

关键词:

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上编译grpc

Windows上源码编译多数开源软件都很麻烦 编译环境:VS2015(grpc支持2013及以上,2012上没有Nuget,编译起来要费劲的多)编译GRPC涉及内容grpcprotobufgrpc_protoc_plugin(本文以c++语言为编译目标,因此只涉及grpc_cpp_plugin)zlib grpc代... 查看详情

如何在windows上编译tesseractocr

安装安装过程中勾选Tesseractdevelopmentfiles:编译在安装目录中找到vs2008到工程目录:找到所有编译相关的库:打开VisualStudio2008(没有的可以去官网下载express版本),导入工程编译。最后生成DEBUG和RELEASE两个版本的DLL参考技术Aso是... 查看详情

在 Windows 上编译时出现 Apache thrift 错误

】在Windows上编译时出现Apachethrift错误【英文标题】:Apachethrifterrorwhilecompilingonwindows【发布时间】:2018-09-2508:22:45【问题描述】:我正在尝试在我的Windows10机器上编译Apachethrift版本0.10.0。出于编译目的,我使用的是apachethrift提供... 查看详情

如何在 Windows 上编译 64 位版本的 ffmpeg?

】如何在Windows上编译64位版本的ffmpeg?【英文标题】:HowdoIcompilea64-bitversionofffmpegonWindows?【发布时间】:2010-01-1414:36:30【问题描述】:我需要为windows编译ffmpeg(64位共享dll)。但是我在mingw中配置,它总是为我生成32位二进制文... 查看详情

Windows XP 的 Mingw GCC 交叉编译

】WindowsXP的MingwGCC交叉编译【英文标题】:MingwGCCcrosscompilationforwindowsXP【发布时间】:2021-12-2111:39:47【问题描述】:我需要在Windows10上编译一个DLL,该DLL需要在WindowsXP上可用。代码使用MingwGCC(而不是MSVC)编译,我不知道要使用... 查看详情

无法在windows上编写的linux上编译c程序[重复]

】无法在windows上编写的linux上编译c程序[重复]【英文标题】:Unabletocompilecprogramonlinuxwrittenonwindows[duplicate]【发布时间】:2017-09-1412:19:40【问题描述】:我在Windows机器上使用MicrosoftVisualStudio在c中开发了项目。该项目已成功编译并... 查看详情

如何在windows上编译chromium并加入mp3支持

...ngw32编译器,只需安装:apt-getinstallmingw32这会安装好mingw32交叉编译系统,用i586-mingw32msvc-gcc即可为Windows编译程序。在编译wxWidgets的Windows版本之前,需要安装DirectX的头文件。大概是由于版权之类的原因,在Debian的mingw32中并未包含... 查看详情

如何在 Windows 上编译 nDPI 库?

...:该库附带有关如何在Linux上编译它的说明:./autogen.sh./配置制作但是我在网上找不到任何资源可以帮助我直接在Windows上编译这段代码,就像我从未有过Linux机器一样。nDPI托管在这里:https://github.com/ntop 查看详情

无法在 Windows 10 上编译 Cairo C 代码

】无法在Windows10上编译CairoC代码【英文标题】:CannotcompileCairoCcodeonWindows10【发布时间】:2017-10-0100:55:24【问题描述】:我正在尝试使用msys64在Windows10上编译zetcodelines。我使用如下编译命令:gccexample.c-oexample`pkg-config--cflags--libscair... 查看详情

如何在(64 位)Windows 上编译 c++ 以制作 64 位 exe?

】如何在(64位)Windows上编译c++以制作64位exe?【英文标题】:HowcanIcompilec++on(64bit)windowstomakea64bitexe?【发布时间】:2012-03-1600:04:32【问题描述】:使用code::blocks附带的g++编译器,我可以编译32位程序,但是当我尝试编译为64位程... 查看详情

MinGW - 交叉编译工具 - 最新版本?

】MinGW-交叉编译工具-最新版本?【英文标题】:MinGW-crosscompiletool-latestversion?【发布时间】:2009-09-1714:30:18【问题描述】:在MinGWdownloadpage,您可以下载“Cross-HostedMinGWBuildTool”,这是一个用于构建“MinGW交叉编译器”的shell脚本... 查看详情

在 Windows 上编译 Vala 源代码

】在Windows上编译Vala源代码【英文标题】:CompilingaValasourceOnWindows【发布时间】:2012-09-0117:00:33【问题描述】:我使用以下命令编译了一个vala程序:valactest.vala我当然可以在我的计算机上运行该程序,但是当我尝试在另一台计算... 查看详情

如何在windows上编译java程序?

参考技术A1、执行cmd命令javac后,显示如图所示编译成功,说明是java运行正常。2、使用检索软件,搜索code.exe的安装路径,默认如图所示。3、打开exe文件所在的路径,找到exe文件,如图所示。4、选中exe文件,右键菜单中选择属... 查看详情

jni_3

①交叉编译概念在windows上编译可以在除了windows平台之外可以执行的机器码android是Linuxwindows编译在linux上执行的机器码动态链接库.so .dll NDKgoogle提供的交叉编译的工具 ②如何使用ndk指令ndk-build 添加到环境变量 ... 查看详情

在 Raspberry 上编译 Qt5 应用程序

...RaspberryPi3上编译一个程序。我已经安装了最新的Raspbian并交叉编译了Qt5.8,如thismanual中所述,然后我尝试构建GST以在板上运行它。编译过程似乎完成了,但是,我有以下链接器错误:root@raspberrypi:/home/p 查看详情

带有 MS-Windows 工具链的预构建 MIPS 交叉编译器

】带有MS-Windows工具链的预构建MIPS交叉编译器【英文标题】:PrebuiltMIPScrosscompilerwithtoolchainforMS-Windows【发布时间】:2017-12-0819:34:16【问题描述】:我在我的Linux机器上使用MIPS交叉编译器,效果很好。现在我需要在Windows上编译相同... 查看详情

mingw 不会在我的 Windows10 上编译 libnet

】mingw不会在我的Windows10上编译libnet【英文标题】:mingwwillnotcompilelibnetonmyWindows10【发布时间】:2020-11-0700:38:34【问题描述】:我使用mingw-get在我的Windows10系统上安装了MinGW。然后我下载了libnet(在github的ZIP文件中)并尝试编译它... 查看详情

无法在 Windows 7 上编译 restbed

...:2017-04-2715:08:41【问题描述】:我已经结束了16个小时的配置、安装、删除、修改和多次敲击我的键盘......我想使用restbed进行独立于平台的C++编程,但我无法构建这些东西。我安装了Cygwin(在2017/04/24下载)(想想git或任何令人... 查看详情