hyunsu blog

홈강좌Rust 입문·중급 47편 중 2편째

Rust 컴파일 오류 읽는 법 — 무엇·어디·고치는 법 세 군데만 본다

목차 · 5
  1. 01느낌표 하나를 빠뜨려 본다
  2. 02번호가 없는 오류도 있다
  3. 03짚는 자리가 엉뚱할 때도 있다
  4. 04오류를 고치는 동안에는 cargo check
  5. 05실습 — help 가 없는 오류 읽기

Rust 컴파일 오류는 길어 보여도 세 군데만 읽으면 된다. 첫 줄의 error 가 무엇이 틀렸는지, --> 줄이 어디인지, help: 줄이 고치는 법이다. 오류를 고치는 동안에는 실행 파일을 만들지 않는 cargo check 로 빨리 확인한다.

01 느낌표 하나를 빠뜨려 본다

1편의 hello 에서 두 번째 println! 의 느낌표를 지우고 cargo run 을 친다.

rust
fn main() {
    println!("Hello, world!");
    println("Hello, Rust!");
}
text
   Compiling hello v0.1.0 (~/projects/hello)
error[E0423]: expected function, found macro `println`
 --> src/main.rs:3:5
  |
3 |     println("Hello, Rust!");
  |     ^^^^^^^ not a function
  |
help: use `!` to invoke the macro
  |
3 |     println!("Hello, Rust!");
  |            +

For more information about this error, try `rustc --explain E0423`.
error: could not compile `hello` (bin "hello") due to 1 previous error
  1. 무엇 — error[E0423] 줄. 함수(function)가 와야 할 자리에 매크로(macro) println 이 왔다는 뜻이다. E0423 은 오류 번호다.
  2. 어디 — --> 줄의 src/main.rs:3:5. 3번째 줄의 5번째 글자다. 바로 아래에 그 줄을 다시 보여 주고 ^ 로 짚는다.
  3. 고치는 법 — help: 줄. 느낌표를 붙이라고 하고, 넣을 자리를 + 로 표시했다.

나머지 줄은 처음에는 건너뛰어도 된다. 끝의 두 줄은 "더 알고 싶으면 rustc --explain E0423 을 쳐 보라" 는 안내와 "그래서 컴파일하지 못했다" 는 마무리다.

02 번호가 없는 오류도 있다

이번에는 첫 println! 끝의 세미콜론을 지운다.

rust
fn main() {
    println!("Hello, world!")
    println!("Hello, Rust!");
}
text
error: expected `;`, found `println`
 --> src/main.rs:2:30
  |
2 |     println!("Hello, world!")
  |                              ^ help: add `;` here
3 |     println!("Hello, Rust!");
  |     ------- unexpected token

문법 자체가 틀리면 번호 없이 error: 로만 시작한다. 읽는 법은 같다.

  1. 무엇 — ; 가 와야 하는데 println 이 왔다.
  2. 어디 — 2번째 줄 끝이다. 3번째 줄의 println 에도 밑줄이 있는데, 컴파일러는 3번째 줄을 읽고 나서야 앞 줄이 안 끝났다는 것을 알기 때문이다.
  3. 고치는 법 — help: add ; here. 2번째 줄 끝에 세미콜론을 넣는다.

Rust 는 문장 하나가 끝날 때마다 세미콜론을 찍는다.

03 짚는 자리가 엉뚱할 때도 있다

main 을 mian 으로 잘못 쓰면 이렇게 나온다.

rust
fn mian() {
    println!("Hello, world!");
}
text
error[E0601]: `main` function not found in crate `hello`
 --> src/main.rs:3:2
  |
3 | }
  |  ^ consider adding a `main` function to `src/main.rs`

무엇 줄은 "main 함수를 찾지 못했다" 고 말한다. 그런데 어디 줄은 3번째 줄의 } 를 가리킨다. 거기가 틀렸다는 뜻이 아니라, 파일 끝까지 읽었는데 main 이 없었다는 뜻이다. 이럴 때는 무엇 줄을 믿고 직접 찾는다. 범인은 1번째 줄의 mian 이다.

04 오류를 고치는 동안에는 cargo check

cargo check 는 컴파일 검사만 하고 실행 파일은 만들지 않는다. 그래서 cargo run 보다 빠르다. 다 고친 hello 에서 치면 이렇게 끝난다.

bash
cargo check
text
    Checking hello v0.1.0 (~/projects/hello)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.12s

첫 단어가 Compiling 이 아니라 Checking 이고 Running 줄이 없다. 실행하지 않았기 때문이다. 고치는 동안에는 cargo check, 다 고치면 cargo run 으로 돌린다.

05 실습 — help 가 없는 오류 읽기

이번에는 닫는 따옴표를 빠뜨렸다. 세 군데로 읽어 보자.

rust
fn main() {
    println!("Hello, world!);
}
text
   Compiling hello v0.1.0 (~/projects/hello)
error[E0765]: unterminated double quote string
 --> src/main.rs:2:14
  |
2 |       println!("Hello, world!);
  |  ______________^
3 | | }
  | |__^

For more information about this error, try `rustc --explain E0765`.
error: could not compile `hello` (bin "hello") due to 1 previous error
  1. 무엇 — 큰따옴표로 연 문자열이 끝나지 않았다(unterminated double quote string).
  2. 어디 — 2번째 줄 14번째 글자, 여는 따옴표 자리다. 그 아래 선이 3번째 줄까지 이어지는 것은 문자열이 파일 끝까지 이어진다고 읽었다는 표시다.
  3. 고치는 법 — 이번에는 help: 줄이 없다. 무엇과 어디를 보고 직접 고친다. world! 뒤에 " 를 넣으면 된다.

help: 는 컴파일러가 고칠 방법을 확신할 때만 나온다. 없으면 무엇과 어디만으로 충분하다. 다음 편부터는 변수를 만들어 보면서 Rust 의 문법을 하나씩 다룬다.