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可执行程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在windows上编译Tesseract OCR

如何在windows上编译Tesseract OCR

如何在windows上编译Tesseract OCR

http服务读取配置文件,交叉编译

如何在 Windows 上编译 libevent2?

在windows 上编译部署Rap2