Rust 에러 E0463: can't find crate (크레이트를 찾을 수 없음)
E0463은 컴파일러가 크레이트(라이브러리) 하나를 통째로 찾으러 갔다가 빈손으로 돌아왔다는 뜻이에요. 보통은 코드에 extern crate 줄이 있는데, 그 크레이트가 Cargo.toml에 없는 경우예요. 가끔은 빠진 크레이트가 std 자체일 때도 있어요. 다른 종류의 기계용으로 빌드하는데 그 타깃(target)을 아직 설치하지 않았을 때 그래요. 둘 다 금방 고칠 수 있고, 링커를 몰라도 괜찮아요. 이 시리즈의 다른 에러는 Rust 컴파일러 에러 해설에서 볼 수 있어요.
에러 메시지
섹션 제목: “에러 메시지”error[E0463]: can't find crate for `rand` --> src/main.rs:1:1 |1 | extern crate rand; | ^^^^^^^^^^^^^^^^^^ can't find crate“can’t find crate for rand“는 “rand 크레이트를 찾을 수 없다”는 뜻이에요.
이 에러를 내는 프로그램은 다음과 같아요. cargo new로 막 만든 프로젝트라서 [dependencies] 아래에 아무것도 없어요.
extern crate rand;
fn main() { let roll = rand::random_range(1..=6); println!("You rolled {roll}");}두 번째로 흔한 형태에는 줄 번호가 아예 없어요. 내 코드의 어느 줄도 std를 요청하지 않기 때문이에요. 모든 프로그램이 std를 필요로 해요.
error[E0463]: can't find crate for `std` | = note: the `aarch64-unknown-linux-gnu` target may not be installed = help: consider downloading the target with `rustup target add aarch64-unknown-linux-gnu`note는 “aarch64-unknown-linux-gnu 타깃이 설치되지 않았을 수 있다”고 알려 주고, help는 “rustup target add로 그 타깃을 내려받으라”고 제안해요. 내 컴퓨터용 타깃만 설치된 상태에서 cargo build --target aarch64-unknown-linux-gnu(라즈베리 파이 같은 64비트 ARM 리눅스)를 실행하면 이 에러가 나와요. 어떤 방법이 필요한지는 크레이트 이름과 note:를 보면 알 수 있어요.
| 보이는 것 | 보통 무엇이 잘못됐나요 | 해결 |
|---|---|---|
extern crate 줄에서 can't find crate for `rand` |
크레이트가 Cargo.toml에 없어요 |
방법 1 |
같은 에러인데, #[macro_use]가 있는 옛 코드 |
2018 에디션 이전에 쓴 코드예요 | 방법 2 |
can't find crate for `std` + target may not be installed |
rustup이 내려받지 않은 타깃용으로 빌드해요 | 방법 3 |
E0463 옆에 crate name using dashes are not valid |
코드 속 크레이트 이름에 -가 있어요 |
방법 4 |
무슨 뜻인가요
섹션 제목: “무슨 뜻인가요”extern crate rand;는 컴파일러에게 “rand라는 컴파일된 라이브러리를 이 프로그램에 연결해 줘”라고 말하는 거예요. 컴파일러는 아무것도 내려받지 않고, 인터넷을 뒤지지도 않아요. Cargo가 건네준 라이브러리만 살펴보고, Cargo는 Cargo.toml에 적힌 크레이트만 건네줘요. 거기에 rand가 없으면 목록에도 rand 라이브러리가 없으니 E0463이 나요.
std의 경우도 한 단계 아래에서 같은 일이 벌어져요. 표준 라이브러리도 컴파일된 라이브러리이고, rustup은 이걸 타깃마다 하나씩 설치해요. 평소 쓰는 툴체인에는 내 컴퓨터용 사본만 있어요. ARM용으로 빌드해 달라고 하면 컴파일러는 ARM용 std를 찾는데, 그런 사본이 없는 거예요.
“찬장에 있는 밀가루를 쓰세요”라고 적힌 레시피와 비슷해요. 아무도 밀가루를 사 오지 않았다면, 레시피가 아무리 좋아도 요리를 시작할 수 없죠.
Rust가 이렇게 하는 이유
섹션 제목: “Rust가 이렇게 하는 이유”Rust에는 Python의 pip install이나 시스템 전체에서 쓰는 node_modules처럼, 설치한 라이브러리를 모두가 함께 쓰는 공용 폴더가 없어요. 프로젝트마다 쓰는 것을 버전과 함께 Cargo.toml에 정확히 적고, Cargo는 그 프로젝트를 위해 그 크레이트들을 빌드해요. 그래서 같은 프로젝트가 내 노트북에서도, 동료 컴퓨터에서도, CI에서도 똑같이 빌드돼요. 적혀 있지 않은 크레이트는 내 코드 입장에서 그냥 존재하지 않는 거예요.
extern crate는 대부분 Rust 2015 시절의 흔적이에요. 2018 에디션부터는 Cargo.toml에 있는 크레이트를 전부 자동으로 쓸 수 있어서, 요즘 코드는 그냥 use rand::random_range;라고 써요. 그래도 옛 튜토리얼이나 Stack Overflow 답변에서는 여전히 extern crate를 만나게 되고, E0463은 대부분 거기서 나와요. 요즘은 의존성이 없을 때 use 줄은 E0432를, 코드 속 경로는 E0433을 내요. 원인은 같고 코드만 달라요.
의존성이 어떻게 동작하는지는 Cargo와 크레이트에서, 툴체인과 타깃은 Rust 도구에서 볼 수 있어요.
고치는 방법
섹션 제목: “고치는 방법”방법 1: cargo add로 크레이트 추가하기
섹션 제목: “방법 1: cargo add로 크레이트 추가하기”빠진 크레이트가 rand, regex, serde_json처럼 crates.io에 있는 크레이트일 때 이 방법을 고르세요. 가장 흔한 경우예요. Cargo.toml이 있는 폴더에서 이렇게 실행하세요.
cargo add randCargo가 최신 버전을 알아서 추가해 줘요.
[dependencies]rand = "0.10.3"이것만으로 E0463은 해결돼요. 하는 김에 extern crate rand; 줄도 지우세요. 2018 에디션 이후에는 필요 없어요(Cargo.toml의 edition = 을 확인해 보세요). 아래 버전은 주사위 값 대신 확인 결과를 출력해서, 실행 결과가 항상 같아요.
fn main() { let roll = rand::random_range(1..=6); println!("주사위 값이 1과 6 사이인가요? {}", (1..=6).contains(&roll));}실행 결과:
주사위 값이 1과 6 사이인가요? true옛 코드는 버전 사이에 바뀐 함수를 호출하고 있을 수도 있어요. cargo add로 E0463은 고쳤는데 thread_rng 같은 이름 때문에 E0425나 E0432가 나온다면, 지금 쓰는 버전의 크레이트 문서를 확인하세요. cargo add로 의존성 추가하기를 참고하세요.
방법 2: 옛 extern crate 줄을 use로 바꾸기
섹션 제목: “방법 2: 옛 extern crate 줄을 use로 바꾸기”2018년 이전 코드를 복사해 왔을 때 이 방법을 고르세요. 그런 코드는 이런 블록으로 시작할 때가 많고, 줄마다 E0463이 날 수 있어요.
#[macro_use]extern crate serde_derive;extern crate serde_json;
#[derive(Serialize)]struct Order { item: String, qty: u32,}error[E0463]: can't find crate for `serde_derive` --> src/main.rs:2:1 |2 | extern crate serde_derive; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ can't find crate
error[E0463]: can't find crate for `serde_json` --> src/main.rs:3:1 |3 | extern crate serde_json; | ^^^^^^^^^^^^^^^^^^^^^^^^ can't find crateserde_derive를 따로 추가하지 마세요. 요즘은 serde의 derive 기능(feature)을 켜면 derive 매크로가 함께 따라와요.
cargo add serde --features derivecargo add serde_json그다음 extern crate 블록을 지우고, 쓰는 것만 평범한 use 줄로 가져오세요. #[macro_use]도 필요 없어요.
use serde::Serialize;
#[derive(Serialize)]struct Order { item: String, qty: u32,}
fn main() { let order = Order { item: String::from("사과"), qty: 3 }; println!("{}", serde_json::to_string(&order).unwrap());}실행 결과:
{"item":"사과","qty":3}extern crate 줄에 적힌 크레이트를 코드에서 실제로 쓰지 않는다면, 그 줄을 그냥 지우면 돼요. 최신 방식의 전체 설정은 serde로 JSON 다루기 강좌에서 볼 수 있어요.
방법 3: rustup target add로 타깃 설치하기
섹션 제목: “방법 3: rustup target add로 타깃 설치하기”에러가 std(또는 core)에 관한 것이고, note:가 타깃이 설치되지 않았을 수 있다고 말할 때 이 방법을 고르세요. 타깃 이름은 help: 줄에서 복사하면 돼요.
rustup target add aarch64-unknown-linux-gnurustup target list --installed # 지금 설치된 타깃 확인하기그다음 같은 --target으로 다시 빌드하세요. 타깃은 내가 컴파일해서 돌릴 기계의 종류예요. aarch64-unknown-linux-gnu나 wasm32-unknown-unknown처럼 “트리플”(triple)이라는 형식으로 써요. rustup이 그 타깃용으로 미리 빌드된 std를 내려받으니 E0463이 사라져요.
두 가지만 알아 두세요. 첫째, 많은 타깃에서 이게 마지막 단계는 아니에요. 다른 운영체제용 프로그램을 통째로 빌드하려면 보통 그 플랫폼용 링커도 필요한데, 그건 다른 에러로 나와요. 둘째, 프로젝트에 rust-toolchain.toml이 있다면 명령을 프로젝트 폴더 안에서 실행하세요. 그래야 rustup이 그 프로젝트가 실제로 쓰는 툴체인에 타깃을 추가해요. 구성 요소와 타깃과, 자주 쓰게 될 타깃을 다루는 WebAssembly 강좌를 참고하세요.
방법 4: 코드에서는 대시를 밑줄로 쓰기
섹션 제목: “방법 4: 코드에서는 대시를 밑줄로 쓰기”serde-json이나 tracing-subscriber처럼 크레이트 이름에 대시(-)가 있을 때 이 방법을 고르세요. Cargo.toml과 명령줄에서는 대시를 써도 괜찮아요. 하지만 Rust 코드에서 -는 빼기 기호라서, 이름은 언제나 _로 써요. 옛 코드에 대시가 있으면 이렇게 나와요.
error: crate name using dashes are not valid in `extern crate` statements --> src/main.rs:1:14 |1 | extern crate serde-json; | ^^^^^^^^^^ dash-separated idents are not valid |help: if the original crate name uses dashes you need to use underscores in the code |1 - extern crate serde-json;1 + extern crate serde_json; |
error[E0463]: can't find crate for `serde_json`첫 번째 에러는 “extern crate 문에서는 대시가 들어간 크레이트 이름을 쓸 수 없다”는 뜻이고, help는 “원래 크레이트 이름에 대시가 있다면 코드에서는 밑줄을 써야 한다”고 알려 줘요. rustc는 이미 이름을 serde_json으로 읽기 때문에, 그 아래의 E0463은 크레이트가 Cargo.toml에서도 빠져 있을 때만 나와요. use 줄에서 대시를 쓰면 expected one of `::`, `;`, or `as`, found `-` 라는 다른 메시지가 나와요. 고치는 법은 어디서나 같아요. 필요하면 cargo add로 크레이트를 추가하고, 코드에서는 _로 쓰세요.
use serde_json::json;
fn main() { let order = json!({ "item": "사과", "qty": 3 }); println!("{order}");}실행 결과:
{"item":"사과","qty":3}내 패키지에도 같은 규칙이 적용돼요. shop-app이라는 프로젝트는 main.rs와 테스트에서 shop_app으로 가져와요.
자주 보게 되는 곳
섹션 제목: “자주 보게 되는 곳”rustc main.rs를 직접 실행할 때. rustc만으로는 Cargo.toml을 읽지 않아요. 그래서 cargo add rand를 한 뒤에도 rustc --edition 2021 src/main.rs는 extern crate rand; 줄에 대해 여전히 can't find crate for `rand` 라고 해요(use rand::... 줄이라면 E0432가 나요). 해결: 의존성을 컴파일러에 넘겨주는 cargo run이나 cargo build로 빌드하세요.
[dev-dependencies]에 있는 크레이트. dev-dependencies(cargo add --dev로 추가한 것)는 테스트, 예제, 벤치마크에서만 존재해요. 일반 코드에서 쓰면 extern crate일 때는 E0463이, 경로일 때는 E0433이 나요. 해결: cargo remove --dev serde_json을 실행한 다음 cargo add serde_json으로 [dependencies]로 옮기세요.
운영체제가 없는 임베디드 보드. thumbv7em-none-eabihf 같은 타깃은 설치만으로는 부족해요. 애초에 std가 없기 때문이에요. 그러면 note가 이렇게 바뀌어요.
error[E0463]: can't find crate for `std` | = note: the `thumbv7em-none-eabihf` target may not support the standard library = note: `std` is required by `shop` because it does not declare `#![no_std]`“이 타깃은 표준 라이브러리를 지원하지 않을 수 있다”, “shop이 #![no_std]를 선언하지 않았으니 std가 필요하다”는 뜻이에요. 해결: 프로그램을 #![no_std]로 작성하세요. 그러면 println!도 쓸 수 없고, 패닉 핸들러도 직접 만들어야 해요. Embedded Rust Book(영어)이 차근차근 안내해 줘요.
관련 에러
섹션 제목: “관련 에러”- E0432:
unresolved import(해결되지 않은 import). 크레이트가Cargo.toml에 없을 때use줄이 내는 에러예요. - E0433:
failed to resolve(경로 해결 실패). 크레이트가 없을 때rand::rng()같은 경로가 내는 에러예요. - E0603: 크레이트는 찾았지만, 가져오려는 항목이 비공개예요.
crate name using dashes are not valid: 에러 코드가 없는 에러예요.-대신_를 쓰세요(방법 4).- 전체 컴파일러 에러: 에러 페이지 전체 목록이에요.
이해도 점검
섹션 제목: “이해도 점검”이해도 점검
1. 옛 코드가 extern crate regex;로 시작하는데 E0463이 나요. 2021 에디션 프로젝트에서 가장 좋은 해결책은 무엇일까요?
2. cargo build --target wasm32-unknown-unknown이 std 크레이트를 찾을 수 없고 타깃이 설치되지 않았을 수 있다고 해요. 무엇을 실행해야 할까요?
3. Cargo.toml에 tracing-subscriber = "0.3"이 있어요. Rust 코드에서는 이 크레이트 이름을 어떻게 쓸까요?
점수: 0 / 3
더 알아보기
섹션 제목: “더 알아보기”- E0463 — Rust error codes index (영어): 크레이트를 찾지 못하는 경우에 대한 공식 설명이에요.
- 크레이트를 사용하여 더 많은 기능 가져오기 — The Rust Programming Language 한국어판: 첫 의존성을
Cargo.toml에 추가하는 과정을 한 단계씩 보여 줘요. - Specifying Dependencies — The Cargo Book (영어): 버전, 기능(feature), 그리고
[dependencies]와[dev-dependencies]의 차이를 다뤄요. - Path and module changes in Rust 2018 — Edition Guide (영어): 왜 이제
extern crate가 필요 없는지 설명해요. - Cross-compilation — The rustup book (영어):
rustup target add로 타깃을 설치하는 방법이에요.