main.rs
와lib.rs
의 관계와rust
에서 모듈을 자유롭게 호출하여 사용하는 방법을 정리하기 위함.- lib.rs파일에 정의한 모듈을 main.rs에서 불러서 사용하는데 정확한 이해가 없기때문.
두 파일의 차이가 뭘까?
lib.rs
: 라이브러리 코드의 집합으로 재사용 가능한 모듈
main.rs
: 실행 가능한 프로그램의 진입점
cargo new project_name
위 명령어로 rust 프로젝트를 만들게되면 기본적으로 main.rs파일이 생성된다. 즉, 바이너리 크레이트를 만드는 것이다.
cargo new lib_project_name --lib
위와 같이 --lib
키워드를 붙여줘야 라이브러리 크레이트를 생성할 수 있다.
Cargo.toml
파일에 아무것도 설정하지 않는다면, 빌드 시 기본적으로 main.rs
를 진입점으로 하는 실행파일이 생성된다.
그러나 Cargo.toml
파일에 lib
에 대해 빌드 설정을 해준다면 동시에 빌드가 가능하다.
[package]
name = "test"
version = "0.1.0"
edition = "2021"
[lib]
name = "my_library"
crate-type = ["cdylib"]
[dependencies]
[lib]
섹션에 cdylib
으로 설정 후 빌드하게 되면
위와 같이 exe
파일과 dll 파일이 함께 생성되는 걸 볼 수 있다.
🔥
[lib]
섹션에서crate-type
을cdylib
으로 설정하면 main.rs에서 lib.rs의 모듈을 가져다가 사용할 수 없음.
lib.rs
pub fn test_func() {
println!("test");
}
main.rs
use my_library::test_func;
fn main() {
test_func();
}
위와 같이 lib.rs
에 pub
접근 제한자를 사용하여 test_func
를 외부에 노출하겠다고 정의해놓으면 main.rs에서 불러다가 사용할 수있다.
여기서 필자가 헷갈린 부분은 아래와 같다.
use my_library::test_func;
여기서 my_library
가 Cargo.toml
파일에서 정의해놓은 lib
의 name
이다.
현재 프로젝트에서는 lib
의 name
을 정의해 놓았지만 만약 default로 설정해놓는다면 lib.rs
와 main.rs
의 crate name이 같으므로 헷갈렸다....
만약 lib.rs에 아래와 같이 test
모듈을 정의했다고 해보자.
pub mod test {
pub fn test_func() {
println!("test");
}
}
test
모듈을 main.rs
에서 불러다가 사용해보자.
use my_library::test;
fn main() {
test::test_func();
}
위와 같이 하면 된다.
만약 temp.rs
파일을 새로 생성 후
원인: Rust의 모듈 시스템 이해
my_lib는 외부 크레이트로 인식됨
use my_lib::test는 Rust가 현재 프로젝트 외부에 my_lib이라는 크레이트가 있다고 가정합니다.
하지만 my_lib은 외부 크레이트가 아니라 현재 프로젝트의 라이브러리 크레이트입니다.
lib.rs는 현재 크레이트 내부에 속함
현재 크레이트의 루트는 lib.rs 또는 main.rs입니다. 따라서 내부 모듈을 참조하려면 crate::를 사용해야 합니다.
다음에 알아보겠다.