wasm-pack: crate-type must be cdylib to compile to wasm32-unknown-unknown
A Rust library defaults to the rlib crate type, which cannot be linked into a WebAssembly module, so wasm-pack stops before it ever calls the compiler. It usually means the crate was started with cargo new rather than from the wasm template, or that a new workspace member inherited the default.
Quick fix
Read the commands before running them. Anything that restarts a service, deletes data or changes permissions should be tried on a non-production system first.
# Cargo.toml of the crate being built, not the workspace root
[lib]
crate-type = ["cdylib", "rlib"] # rlib keeps cargo test working
[dependencies]
wasm-bindgen = "0.2"
# Build for the browser and look at what came out
wasm-pack build --target web
ls pkg/
# In a workspace, point wasm-pack at the member, it builds one crate
wasm-pack build crates/frontend --target bundler
# Without wasm-pack the crate type requirement is the same
rustup target add wasm32-unknown-unknown
cargo build --target wasm32-unknown-unknown --release
# A binary crate (src/main.rs) is a different shape again: it needs
# --target wasm32-wasip1 and a runtime, not wasm-bindgen
How to diagnose WebAssembly errors
WebAssembly errors are precise about the layer that failed. A CompileError means the bytes are not a valid module: most often the file was served with the wrong MIME type, or an HTML error page was fetched instead of the .wasm file. A RuntimeError: memory access out of bounds means the module read or wrote outside its linear memory, which in a language like C or Rust is a genuine memory-safety bug caught by the sandbox.
If the quick fix above does not resolve it, work through these steps. They apply to this whole class of error, not just to this one message, which is usually what saves the time.
- Check what the server actually returned. The wasm file must be served as
application/wasmfor streaming compilation, and a 404 HTML page produces a misleading magic-number error. - Validate the module offline with
wasm-validateand inspect it withwasm-objdump -xfrom the WABT toolkit. - For out-of-bounds errors, rebuild with sanitizers or debug assertions in the source language. The wasm runtime cannot tell you which source line was responsible without DWARF info.
- Confirm imports match: every function the module imports must be supplied by the host with the exact name and signature, or instantiation fails.
- Build with debug symbols and use the browser's DWARF support to step through original source rather than raw wasm.
Tools worth reaching for
wasm-validate / wasm-objdump (WABT)browser DWARF debuggingwasmtime --invokecurl -I (check MIME type)
Authoritative references
Primary documentation for this error, worth reading before applying any fix in production.
Related WebAssembly errors
- Emscripten: Cannot call unknown function (make sure it is exported)ccall and cwrap look the symbol up in the module at runtime, and the linker had already…
- Emscripten: RuntimeError: Aborted(). Build with -sASSERTIONS for more info.Emscripten's runtime hit a fatal condition and called abort(), but release builds leave out…
- Rust: Could not find specification for target "wasm32-wasi"Rust renamed the wasm32-wasi target to wasm32-wasip1 to make room for WASI 0.2, then removed…
- wasm-bindgen: closure invoked after being droppedA Rust closure handed to JavaScript lives only as long as its Closure value, and letting that…
- wasm-bindgen: recursive use of an object detectedA Rust method holding a mutable borrow of a struct called into JavaScript, and that…
- WebAssembly: Cannot enlarge memory arraysThe module asked for more linear memory than it was built to have. Emscripten fixes the heap…
- WebAssembly: CompileError - invalid magic / sectionThe .wasm file is not valid WebAssembly bytes. Often the server returned an HTML error page…
- WebAssembly: Import #0 module="env" error: module is not an object or functionThe module declares imports and the importObject handed to instantiate has no property for…
Browse other categories
- HTTP 494xx client errors, 5xx server errors, redirects, headers and protocol problems.
- JavaScript 42npm resolution, async pitfalls, hydration, memory limits and runtime type…
- Database 41Connections, deadlocks, constraints, replication and memory limits.
- AI 35Rate limits, context windows, GPU memory and model-serving failures.
- Network 35Refused connections, timeouts, resets, MTU problems and port exhaustion.
- Python 35Imports, virtual environments, encoding, concurrency and dependency conflicts.
- Kubernetes 34CrashLoopBackOff, ImagePullBackOff, OOMKilled, RBAC, scheduling and storage.
- Docker 27Daemon connectivity, disk space, image pulls, ports and architecture mismatches.
- System 26Disk space, systemd units, file descriptors, OOM killer and scheduled jobs.
- Cloud 25IAM permissions, quotas, service limits and credential failures.
- Security 25JWT validation, CSRF, OAuth grants, SELinux, SSH host keys and CSP.
- TLS 24Untrusted authorities, expiry, hostname mismatch, chains and cipher negotiation.
Something missing or wrong?
This entry is maintained by hand. If the fix is out of date, incomplete, or you have a better one, email a correction and it will be reviewed.