在 Linux 上构建 Windows 程序

(也可以查看 Windows 平台页面,了解有关为 Windows 开发的一般信息)


Rust 为构建 Windows 程序提供了两种不同的工具链:

  • MSVC:在 Windows 上构建程序时默认的工具链,需要下载微软的 SDK。
  • GNU:基于 MINGW 的替代构建方式,可能设置起来更容易

首次设置 MSVC

Rust MSVC 工具链

实际上,你可以在 Linux 上使用相同的基于 MSVC 的 Rust 工具链,这也是在 Windows 构建程序时使用的方案。

将需要支持的目标平台添加到你的 Rust 安装库中(假设你使用了 rustup):

1
rustup target add x86_64-pc-windows-msvc

这就安装了 Rust 为 Windows 编译程序所需的文件,包括 Rust 标准库。

Microsoft Windows SDKs

你需要安装微软的 Windows SDK,就像在 Windows 上工作时一样。在 Linux 上,这可以通过一个叫做 xwin 的简单脚本来完成。你需要接受微软的专利许可。

安装 xwin:

cargo install xwin

现在,使用 xwin 接受微软的许可,从微软服务器下载所有文件,并将它们安装到你选择的目录中。

例如,假设要安装到 /opt/xwin/: 建议使用/home/$USER/.xwin

1
xwin --accept-license  splat --output /home/$USER/.xwin

链接 (MSVC)

Rust 需要知道如何链接最终的 EXE 文件。

默认的微软链接器(link.exe)在 Linux 上是不可用的。相反,我们需要使用 LLD 链接器(无论如何,在 Windows 上工作时也推荐使用这个)。只要在你的 Linux 发行版中安装 lld 包就可以了。

1
sudo apt install lld

我们还需要告诉 Rust 微软 Windows SDK 库的位置(在上一步骤中与 xwin 一起安装时指定的位置)。

把这个添加到 .cargo/config.toml 中(位于你的主文件夹或你的 bevy 项目中)。

注意:要在项目里面创建这个文件 https://doc.rust-lang.org/cargo/reference/config.html

1
2
3
4
5
6
7
[target.x86_64-pc-windows-msvc]
linker = "lld"
rustflags = [
"-Lnative=/home/landv/.xwin/crt/lib/x86_64",
"-Lnative=/home/landv/.xwin/sdk/lib/um/x86_64",
"-Lnative=/home/landv/.xwin/sdk/lib/ucrt/x86_64"
]

首次设置 GNU

Rust GNU 工具链

你也可以使用其他基于 GNU 的 Windows 工具链。

将需要支持的目标平台添加到你的 Rust 安装中(假设你使用 rustup)。

1
rustup target add x86_64-pc-windows-gnu

这就安装了 Rust 为 Windows 编译程序所需的文件,包括 Rust 标准库。

MINGW

GNU 工具链需要安装 MINGW 环境,你的发行版可能为它提供了一个软件包。在你的发行版中搜索一个交叉编译的 MINGW 软件包。

它可能被称为:cross-x86_64-w64-mingw32,但这在不同的发行版中会有所不同。

你不需要来自微软的任何文件。

构建你的项目

最终,在完成所有的设置后,你就可以为 Windows 构建你的 Rust/Bevy 项目了。

1
cargo build --target=x86_64-pc-windows-msvc --release
1
cargo build --target=x86_64-pc-windows-gnu --release

wine

字体和主题

https://linux.zone/362

1
sudo apt install winetricks
  • deepin-wine6-stable 改名为wine

    • ```shell
      cp cat /usr/bin/deepin-wine6-stable /usr/bin/wine
      1
      2
      3
      4

      - ```shell
      #修改这里 name=$(basename $0)
      name="deepin-wine6-stable"

交叉编译问题

  • PKG_CONFIG_SYSROOT_DIR

    • PKG_CONFIG_SYSROOT_DIR=/usr/x86_64-w64-mingw32/ cargo build
  • 放弃了用mxe.cc这个交叉编译库吧。

    • PKG_CONFIG_SYSROOT_DIR=/usr/lib/mxe/usr/x86_64-w64-mingw32.static cargo build –release –target x86_64-pc-windows-gnu
  • https://blog.csdn.net/love906897406/article/details/125776951

    • vim ~/.cargo/config 插入以下内容,没有这个文件新增即可

    • ```txt
      [target.x86_64-pc-windows-gnu]
      linker = “x86_64-w64-mingw32-gcc”
      ar = “x86_64-w64-mingw32-gcc-ar”

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56


      - 基于rustdesk

      - https://gitee.com/landv_admin/QtyDesk 使用QT模仿rustdesk

      - UI

      - Windows win32api `native-windows-gui`
      - win7以上,linux用wine一样可以用
      - https://github.com/iced-rs/iced
      - 主要是渲染问题,和显卡有关系,基本上只支持新系统。

      `好吧都不支持xp系统,不是库问题就是rust放弃支持xp了`

      - 可以考虑使用LCUI这种也是中转原生api,可以改写用rust直接调用native api 进行绘制gui。
      - 只有Windows需要考虑依赖问题,如果使用原生UI就不用考虑依赖,只需要美化UI即可。(编译体积可以优化到几百kb)
      - 直接`native-windows-gui`
      - linux、MAC PC系统(有ARM版本,Cross-Compiler)、iOS、Android 无需考虑依赖问题。
      - linux前期
      - linux、MAC 优先使用gtk-rs、iced-rs。
      - IOS、Android 使用Flutter 开发移动端。
      - Flutter+rust直接开发,移动端界面可以保持一致。

      # rust编译和优化

      - 压缩编译体积

      - 单文件编译 rustc main.rs
      - cargo工具编译cargo build --release
      - 删除无用符号 strip -s main
      - upx压缩
      - https://www.aloxaf.com/2018/09/reduce_rust_size/

      - 交叉编译

      - rustup target list
      - rustup target add
      - cargo build --release --target x86_64-pc-windows-gnu
      - strip -s
      - upx

      PKG_CONFIG_SYSROOT_DIR=/usr/x86_64-w64-mingw32/ cargo build --release --target x86_64-pc-windows-gnu

      PKG_CONFIG_SYSROOT_DIR=/usr/i686-w64-mingw32/ cargo build --release --target x86_64-pc-windows-gnu

      # rust程序设计语言

      - 官方中文学习文档https://www.rust-lang.org/zh-CN

      **使用镜像加速安装**

      ```shell
      export RUSTUP_DIST_SERVER=https://mirrors.sjtug.sjtu.edu.cn/rust-static
      export RUSTUP_UPDATE_ROOT=https://mirrors.sjtug.sjtu.edu.cn/rust-static/rustup
      curl https://sh.rustup.rs -sSf | sh
1
2
3
export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
curl https://mirrors.ustc.edu.cn/rust-static/rustup/rustup-init.sh | sh

再补充几个 cargo 的重要子命令:

1
2
cargo build 
cargo run
  • cargo clippy: 类似eslint,lint工具检查代码可以优化的地方
  • cargo fmt: 类似go fmt,代码格式化
  • cargo tree: 查看第三方库的版本和依赖关系
  • cargo bench: 运行benchmark(基准测试,性能测试)
  • cargo udeps(第三方): 检查项目中未使用的依赖

另外 cargo build/run –release 使用 release 编译会比默认的 debug 编译性能提升 10 倍以上,但是 release 缺点是编译速度较慢,而且不会显示 panic backtrace 的具体行号

rust开发远程协助

放弃使用fltk了虽然体积小(跨平台里面是小的)但在跨平台里面有很多不兼容,最主要是太丑了。

https://github.com/iiordanov/remote-desktop-clients VNC, RDP, SPICE, and oVirt/RHEV/Proxmox Clients for Android and Blackberry 10

最终方式

linux端采用Druid方式,移动端flutter

windows被控端采用native-windows-gui

PC端:iced、egui flutter QT

网易 Duilib 如何绑定到rust使用,native-windows-gui 使用的是win32 界面有点丑。也可以直接使用GitHub - lc-soft/LCUI: A small C library for building user interfaces with C, XML and CSS.

flutter瘦身

https://www.mobibrw.com/2021/31671

Slint - 快速简单的 UI 工具包 QT前开发人员,使用rust开发的UI界面库

1
2
export PATH="/home/landv/Qt5.14.2/5.14.2/gcc_64/bin:$PATH"
export LD_LIBRARY_PATH="/home/landv/Qt5.14.2/5.14.2/gcc_64/lib:$PATH"

rust qt编译

  • sudo apt install mxe-x86-64-w64-mingw32.static.qt5 使用mxe安装静态交叉编译库。

/usr/lib/mxe/usr/x86_64-w64-mingw32.static

export PATH=”/home/landv/Qt/5.15.2/gcc_64_static/bin:$PATH” export LD_LIBRARY_PATH=”/home/landv/Qt/5.15.2/gcc_64_static/lib:$PATH”

rust-qt 暂时不支持静态编译,交叉编译也费劲。so,要么把rust编译成静态库供QT调用,要么换其他的GUI库。