FAQ de compilação cruzada
Esta página reúne perguntas sobre build específicas de targets. Para falhas de instalação, carregamento, runtime, geração de tipos e publicação, comece pelo guia de solução de problemas. Para escolher uma estratégia de compilação cruzada, use o guia de decisão Compilação cruzada.
Compilar para Linux alpine
https://github.com/rust-lang/rust/pull/40113#issuecomment-323193341
Por padrão, você não pode definir o crate-type de compilação como cdylib
quando o target de compilação é *-unknown-linux-musl.
Se quiser fazer isso, você precisa passar -C target-feature=-crt-static para
o rustc.
A CLI do NAPI-RS cuida disso para você: para qualquer target *musl*,
napi build adiciona automaticamente -C target-feature=-crt-static à
variável de ambiente RUSTFLAGS, e o projeto gerado por napi new já compila
seus targets musl dessa forma.
Como a CLI exporta isso pela variável de ambiente RUSTFLAGS, quaisquer
rustflags no seu .cargo/config.toml são ignorados em builds musl
(variáveis de ambiente têm precedência no Cargo). Se você precisar de flags
extras do rustc para um target musl, adicione-as à variável de ambiente
RUSTFLAGS em vez do .cargo/config.toml.
Se você usa o allocator mimalloc,
habilite a feature local_dynamic_tls dele para targets musl; caso contrário,
o addon pode falhar em runtime com um erro de alocação de thread-local storage.
Veja Compilação cruzada para como compilar targets musl a partir de qualquer host.
GLIBC_x.yy not found
Error: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found
Um addon *-linux-gnu linka dinamicamente contra glibc e exige, no mínimo, a
versão de glibc da máquina que o compilou. Se o host de build roda uma
distro mais nova do que o host de deploy, o addon falha ao carregar com esse
erro.
A correção é compilar contra uma glibc mais antiga:
- Em um host Linux x64/arm64, compile com
--use-napi-cross— ele fixa o piso de glibc em 2.17, que carrega em praticamente qualquer distro com glibc. - A partir de um host macOS ou Windows, compile com
--cross-compile(-x) — o piso passa a ser a glibc padrão do zig: mais nova que 2.17, mas independente da distro do seu host.
Não mude para um target *-musl para corrigir esse erro. Musl é uma libc
diferente, para distros no estilo Alpine, e não uma forma de reduzir um
requisito de glibc. Veja Glibc versions para
os detalhes.
rustls / aws-lc-sys falha com --use-napi-cross em aarch64
Se o seu crate depende de rustls — muitas vezes transitivamente, via
reqwest ou hyper-rustls — o backend padrão dele, aws-lc-sys, falha ao
fazer compilação cruzada para aarch64-unknown-linux-gnu com
--use-napi-cross: o gcc incluído em
@napi-rs/cross-toolchain é
antigo demais para aws-lc-sys
(cross-toolchain#4).
Duas soluções de contorno:
-
Compile as partes em C com
clangem vez do gcc incluído:shTARGET_CC=clang TARGET_CXX=clang++ napi build --release --target aarch64-unknown-linux-gnu --use-napi-cross -
Use
--cross-compile(-x) em vez de--use-napi-cross.
Veja a seção Native dependencies do guia de Compilação cruzada para outros problemas recorrentes de compilação cruzada de C/C++.
Compilar para Windows i686
Há um erro de codegen quando o target de compilação é i686-windows-*:
Rust issue 67497.
Existe uma solução alternativa para evitar esse problema:
- Defina
ltocomo falso. Se você não tiver definidoltonoCargo.toml, o valor já é falso por padrão, então pode ignorar esta etapa. - Defina
codegen-unitscomo32(ou mais). O valor padrão decodegen-unitsé16quando o target de compilação é release. Você pode definirCARGO_PROFILE_RELEASE_CODEGEN_UNITS=32eCARGO_PROFILE_RELEASE_LTO='false'para deixar o compilador satisfeito ao mirari686-windows-*. Aqui está um exemplo.