salvo-rs / salvo

A powerful web framework built with a simplified design.
https://salvo.rs
Apache License 2.0
3.4k stars 208 forks source link

features添加quinn后,无法在windows上交叉编译为linux二进制 #782

Closed 1225754321 closed 5 months ago

1225754321 commented 5 months ago

Describe the bug features选择quinn后,无法在windows上交叉编译为linux二进制 查看Cargo.lock发现是因为quinn-proto使用的ring库版本为0.16.20 其他库调用的是ring为0.17.8就可以正常编译

To Reproduce Steps to reproduce the behavior:

  1. 使用windows机器
  2. 创建一个普通的salvo项目,features添加quinn
  3. .cargo/config.toml配置如下 [target.x86_64-unknown-linux-musl] linker = "rust-lld" rustflags = ["-C", "linker-flavor=ld.lld"]
  4. 在项目目录执行 cargo build -r --target x86_64-unknown-linux-musl
  5. 编译报错
    
    Compiling slab v0.4.9
    The following warnings were emitted during compilation:

warning: ring@0.17.8: Compiler family detection failed due to error: ToolNotFound: Failed to find tool. Is musl-gcc installed? (see https://github.com/rust-lang/cc-rs#compile-time-requirements for help) warning: ring@0.17.8: Compiler family detection failed due to error: ToolNotFound: Failed to find tool. Is musl-gcc installed? (see https://github.com/rust-lang/cc-rs#compile-time-requirements for help)

error: failed to run custom build command for ring v0.17.8

Caused by: process didn't exit successfully: D:\git\urlmock\target\release\build\ring-7a3d44b58d2184a0\build-script-build (exit code: 1) --- stdout cargo:rerun-if-env-changed=RING_PREGENERATE_ASM cargo:rustc-env=RING_CORE_PREFIX=ring_core_0_178 OPT_LEVEL = Some("3") TARGET = Some("x86_64-unknown-linux-musl") HOST = Some("x86_64-pc-windows-msvc") cargo:rerun-if-env-changed=CC_x86_64-unknown-linux-musl CC_x86_64-unknown-linux-musl = None cargo:rerun-if-env-changed=CC_x86_64_unknown_linux_musl CC_x86_64_unknown_linux_musl = None cargo:rerun-if-env-changed=TARGET_CC TARGET_CC = None cargo:rerun-if-env-changed=CC CC = None RUSTC_LINKER = Some("rust-lld") cargo:rerun-if-env-changed=CROSS_COMPILE CROSS_COMPILE = None cargo:rerun-if-env-changed=CC_ENABLE_DEBUG_OUTPUT cargo:warning=Compiler family detection failed due to error: ToolNotFound: Failed to find tool. Is musl-gcc installed? (see https://github.com/rust-lang/cc-rs#compile-time-requirements for help) cargo:rerun-if-env-changed=CRATE_CC_NO_DEFAULTS CRATE_CC_NO_DEFAULTS = None DEBUG = Some("false") CARGO_CFG_TARGET_FEATURE = Some("fxsr,sse,sse2") cargo:rerun-if-env-changed=CFLAGS_x86_64-unknown-linux-musl CFLAGS_x86_64-unknown-linux-musl = None cargo:rerun-if-env-changed=CFLAGS_x86_64_unknown_linux_musl CFLAGS_x86_64_unknown_linux_musl = None cargo:rerun-if-env-changed=TARGET_CFLAGS TARGET_CFLAGS = None cargo:rerun-if-env-changed=CFLAGS CFLAGS = None cargo:warning=Compiler family detection failed due to error: ToolNotFound: Failed to find tool. Is musl-gcc installed? (see https://github.com/rust-lang/cc-rs#compile-time-requirements for help)

--- stderr

error occurred: Failed to find tool. Is musl-gcc installed? (see https://github.com/rust-lang/cc-rs#compile-time-requirements for help)



**Expected behavior**
正常编译

**Screenshots**
无

**Desktop (please complete the following information):**
 - OS: windows10/1809

**Additional context**
无
chrislearn commented 5 months ago

直接用 github 的 main 分支试试,应该已经升级过了,只是没有发布新版本。

1225754321 commented 5 months ago

好的,万分感谢

1225754321 commented 5 months ago

改用main分支后还是有一样的问题

salvo = { git = "https://github.com/salvo-rs/salvo.git", branch = "main", features = [
    "serve-static",
    "quinn",
    "logging",
] }
The following warnings were emitted during compilation:

warning: ring@0.17.8: Compiler family detection failed due to error: ToolNotFound: Failed to find tool. Is `musl-gcc` installed? (see https://github.com/rust-lang/cc-rs#compile-time-requirements for help)
warning: ring@0.17.8: Compiler family detection failed due to error: ToolNotFound: Failed to find tool. Is `musl-gcc` installed? (see https://github.com/rust-lang/cc-rs#compile-time-requirements for help)

error: failed to run custom build command for `ring v0.17.8`

Caused by:
  process didn't exit successfully: `D:\git\urlmock\target\release\build\ring-7a3d44b58d2184a0\build-script-build` (exit code: 1)
  --- stdout
  cargo:rerun-if-env-changed=RING_PREGENERATE_ASM
  cargo:rustc-env=RING_CORE_PREFIX=ring_core_0_17_8_
  OPT_LEVEL = Some("3")
  TARGET = Some("x86_64-unknown-linux-musl")
  HOST = Some("x86_64-pc-windows-msvc")
  cargo:rerun-if-env-changed=CC_x86_64-unknown-linux-musl
  CC_x86_64-unknown-linux-musl = None
  cargo:rerun-if-env-changed=CC_x86_64_unknown_linux_musl
  CC_x86_64_unknown_linux_musl = None
  cargo:rerun-if-env-changed=TARGET_CC
  TARGET_CC = None
  cargo:rerun-if-env-changed=CC
  CC = None
  RUSTC_LINKER = Some("rust-lld")
  cargo:rerun-if-env-changed=CROSS_COMPILE
  CROSS_COMPILE = None
  cargo:rerun-if-env-changed=CC_ENABLE_DEBUG_OUTPUT
  cargo:warning=Compiler family detection failed due to error: ToolNotFound: Failed to find tool. Is `musl-gcc` installed? (see https://github.com/rust-lang/cc-rs#compile-time-requirements for help)
  cargo:rerun-if-env-changed=CRATE_CC_NO_DEFAULTS
  CRATE_CC_NO_DEFAULTS = None
  DEBUG = Some("false")
  CARGO_CFG_TARGET_FEATURE = Some("fxsr,sse,sse2")
  cargo:rerun-if-env-changed=CFLAGS_x86_64-unknown-linux-musl
  CFLAGS_x86_64-unknown-linux-musl = None
  cargo:rerun-if-env-changed=CFLAGS_x86_64_unknown_linux_musl
  CFLAGS_x86_64_unknown_linux_musl = None
  cargo:rerun-if-env-changed=TARGET_CFLAGS
  TARGET_CFLAGS = None
  cargo:rerun-if-env-changed=CFLAGS
  CFLAGS = None
  cargo:warning=Compiler family detection failed due to error: ToolNotFound: Failed to find tool. Is `musl-gcc` installed? (see https://github.com/rust-lang/cc-rs#compile-time-requirements for help)

  --- stderr

  error occurred: Failed to find tool. Is `musl-gcc` installed? (see https://github.com/rust-lang/cc-rs#compile-time-requirements for help)

warning: build failed, waiting for other jobs to finish...
1225754321 commented 5 months ago
打包相关:
暂时无法在win下直接使用`cargo build -r --target x86_64-unknown-linux-musl`, 进行交叉编译
这里提供两个方案: 
1. 直接到linux环境进行编译为linux二进制
2. 使用zig进行交叉编译,步骤如下
   1. 安装zig
      1. 安装Scoop
         1. 打开Windows Powershell
         2. 在PowerShell命令控制台执行: `iex (new-object net.webclient).downloadstring('https://get.scoop.sh')`
      2. 使用scoop安装zig: 在PowerShell命令控制台执行: `scoop install zig`
   2. 安装cargo-zigbuild
      1. `cargo install cargo-zigbuild`
   3. 使用zigbuild进行编译
      1. 注意需要调整`.cargo/config.toml`
         1. ```toml
         [target.x86_64-unknown-linux-musl]
         linker = "rust-lld"
         rustflags = ["-C", "linker-flavor=ld.lld"]
     改为
     ```toml
     [target.x86_64-unknown-linux-musl]
     ```
  2. 执行编译命令: `cargo zigbuild -r --target x86_64-unknown-linux-musl`
  1. 成功编译