rust交叉编译配置:windows上编译linux可执行程序
Posted sqhhhhAA111i
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rust交叉编译配置:windows上编译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 上编译 libevent2?
【中文标题】如何在 Windows 上编译 libevent2?【英文标题】:How to compile libevent2 on Windows? 【发布时间】:2012-01-26 00:56:34 【问题描述】:我正在尝试将this libevent2 package 编译到 Windows,但目前我不能,因为配置脚本是一个 shell 脚本(/bin/sh;不能在 Windows 中运行)。
有什么方法可以编译它或获得一个预编译包?我目前安装了 MinGW、CMake 和 MS C++。
编辑:我已经设法使用 nmake Makefile.nmake 编译了 libevent2,但它没有生成任何 Windows 二进制文件/库。只有.lib。
makefile如下-
# WATCH OUT! This makefile is a work in progress. It is probably missing
# tons of important things. DO NOT RELY ON IT TO BUILD A GOOD LIBEVENT.
# Needed for correctness
CFLAGS=/IWIN32-Code /Iinclude /Icompat /DWIN32 /DHAVE_CONFIG_H /I.
# For optimization and warnings
CFLAGS=$(CFLAGS) /Ox /W3 /wd4996 /nologo
# XXXX have a debug mode
LIBFLAGS=/nologo
CORE_OBJS=event.obj buffer.obj bufferevent.obj bufferevent_sock.obj \
bufferevent_pair.obj listener.obj evmap.obj log.obj evutil.obj \
strlcpy.obj signal.obj bufferevent_filter.obj evthread.obj \
bufferevent_ratelim.obj evutil_rand.obj
WIN_OBJS=win32select.obj evthread_win32.obj buffer_iocp.obj \
event_iocp.obj bufferevent_async.obj
EXTRA_OBJS=event_tagging.obj http.obj evdns.obj evrpc.obj
ALL_OBJS=$(CORE_OBJS) $(WIN_OBJS) $(EXTRA_OBJS)
STATIC_LIBS=libevent_core.lib libevent_extras.lib libevent.lib
all: static_libs tests
static_libs: $(STATIC_LIBS)
libevent_core.lib: $(CORE_OBJS) $(WIN_OBJS)
lib $(LIBFLAGS) $(CORE_OBJS) $(WIN_OBJS) /out:libevent_core.lib
libevent_extras.lib: $(EXTRA_OBJS)
lib $(LIBFLAGS) $(EXTRA_OBJS) /out:libevent_extras.lib
libevent.lib: $(CORE_OBJS) $(WIN_OBJS) $(EXTRA_OBJS)
lib $(LIBFLAGS) $(CORE_OBJS) $(EXTRA_OBJS) $(WIN_OBJS) /out:libevent.lib
clean:
del $(ALL_OBJS)
del $(STATIC_LIBS)
cd test
$(MAKE) /F Makefile.nmake clean
tests:
cd test
$(MAKE) /F Makefile.nmake
【问题讨论】:
【参考方案1】:.lib 文件是 Windows 二进制文件。它是一个静态库文件,应用程序中的链接器使用它来静态链接(即外行术语中的“使用”)库。
由于 libevent2 不是程序,您不会得到 .exe 输出 - 它将是一个大 .dll + 小 .lib(用于动态链接)或一个大 .lib(用于静态链接)。
【讨论】:
谢谢,我设法编译了 .lib 文件,但我没有意识到它们是库【参考方案2】:使用Cygwin编译。这是一个类似于 Linux 的仿真。
【讨论】:
以上是关于rust交叉编译配置:windows上编译linux可执行程序的主要内容,如果未能解决你的问题,请参考以下文章