Rust, Crate

Jeonghak Cho·2025년 1월 1일

Rust

목록 보기
3/13

Crate

Crate는 러스트 컴파일러에 의해 컴파일되는 하나의 원자적인 단위이다.
cargo new mylib --lib 라고 명령을 날리면 하나의 라이브러리 Crate가 생성된다. 기본적으로 src/lib.rs 파일이 라이브러리 Crate이다.

vagrant@master:~/samples/mylib$ cargo build
   Compiling mylib v0.1.0 (/home/vagrant/samples/mylib)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.08s
vagrant@master:~/samples/mylib$ tree
.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── lib.rs
├── target
│   ├── CACHEDIR.TAG
│   └── debug
│       ├── build
│       ├── deps
│       │   ├── libmylib-c1c6b76f9e8c0f00.rlib
│       │   ├── libmylib-c1c6b76f9e8c0f00.rmeta
│       │   └── mylib-c1c6b76f9e8c0f00.d
│       ├── examples
│       ├── incremental
│       │   └── mylib-1whsyu8f8bwb9
│       │       ├── s-h39br4isny-0kzqo7j-a093hbvjpvmnkr3052zdglxc8
│       │       │   ├── cok1kemyn5jdgnpyb5w2ca14h.o
│       │       │   ├── dep-graph.bin
│       │       │   ├── query-cache.bin
│       │       │   └── work-products.bin
│       │       └── s-h39br4isny-0kzqo7j.lock
│       ├── libmylib.d
│       └── libmylib.rlib
└── tests
    └── mytest.rs

cargo new myapp --bin 은 하나의 애플리케이션(바이너리)를 생성한다. 기본적으로 src/main.rs 파일이 바이너리 크레이트 이다.

vagrant@master:~/samples$ cargo new myapp
    Creating binary (application) `myapp` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
vagrant@master:~/samples$ cd myapp
vagrant@master:~/samples/myapp$ cargo build
   Compiling myapp v0.1.0 (/home/vagrant/samples/myapp)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.15s
vagrant@master:~/samples/myapp$ tree
.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target
    ├── CACHEDIR.TAG
    └── debug
        ├── build
        ├── deps
        │   ├── myapp-d3de11b04e7e24db
        │   └── myapp-d3de11b04e7e24db.d
        ├── examples
        ├── incremental
        │   └── myapp-1cw6iyvmdbnom
        │       ├── s-h39bw62zrx-0hlw41u-8m2ooriqjeevcac7ztsje679v
        │       │   ├── 1bk5xml1c0lahuh3f2mzrntrd.o
        │       │   ├── 4nswv1h0p6zbfqip62bqyoq0e.o
        │       │   ├── 96zy18jd53kfbst9vkygl63ky.o
        │       │   ├── aku6fhczaf9wy532qman52e6g.o
        │       │   ├── awqc18yictgz0zuy73tuiv1tj.o
        │       │   ├── dep-graph.bin
        │       │   ├── erjta0ouvi4wbb6xw6m9snb24.o
        │       │   ├── query-cache.bin
        │       │   └── work-products.bin
        │       └── s-h39bw62zrx-0hlw41u.lock
        ├── myapp
        └── myapp.d

9 directories, 18 files

산출 아티팩트

*.rlib

러스트 라이브러리로 의존성 컴파일 코드를 포함한다. dll 파일과 다른 포맷이다. 만약 동적 dll형태로 컴파일 결과를 가지고 싶다면 Cargo.toml에 아래와 같이 설정한 후 build 한다. 이 경우 libmylib.so 파일이 함께 생성된다.

[package]
name = "mylib"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["cdylib"]

[dependencies]

정적 dll 도 생성가능하다. 이 경우 아래처럼 설정한 후 build 한다. 생성 파일은 libmylib.a 가 된다.

[lib]
crate-type = ["staticlib"]

*.d

myapp.d는 MakeFile 호환 의존 목록이다.

vagrant@master:~/samples/myapp$ cat target/debug/myapp.d
/home/vagrant/samples/myapp/target/debug/myapp: /home/vagrant/samples/myapp/src/main.rs

실행파일

myapp은 최종 애플리케이션이다. 릴리즈 모드로 빌드했을 때와 파일 크기를 비교해 보면 무려 9배의 차이가 난다. 배포 시 최적화 모드인 release 빌드를 꼭 진행해야 한다. (cargo build --release)

vagrant@master:~/samples$ du -sh myapp/target/release/myapp
412K    myapp/target/release/myapp
vagrant@master:~/samples$ du -sh myapp/target/debug/myapp
3.7M    myapp/target/debug/myapp

deps

컴파일된 의존성 파일들

examples

examples 폴더 내에서 실행된 코드 결과물로 cargo test 수행 시 컴파일된다. cargo run --example main 형태로 실행 가능하다.

incremental

중복 컴파일을 제거하여 빌드 속도를 높이기 위해 캐싱하는 파일들이다.

build

build 를 위한 scratch space 로 사용한다. scratch space는 사용자를 위한 임시 저장 영역이다.

0개의 댓글