Rust 프로젝트 구조 이해하기 : main.rs 와 lib.rs의 관계

wangki·2025년 1월 9일
0

Rust

목록 보기
4/54

글을 쓰는 이유

  1. main.rslib.rs의 관계와 rust에서 모듈을 자유롭게 호출하여 사용하는 방법을 정리하기 위함.
  2. lib.rs파일에 정의한 모듈을 main.rs에서 불러서 사용하는데 정확한 이해가 없기때문.

main.rs와 lib.rs의 이해

두 파일의 차이가 뭘까?

lib.rs : 라이브러리 코드의 집합으로 재사용 가능한 모듈
main.rs : 실행 가능한 프로그램의 진입점

cargo new project_name

위 명령어로 rust 프로젝트를 만들게되면 기본적으로 main.rs파일이 생성된다. 즉, 바이너리 크레이트를 만드는 것이다.

cargo new lib_project_name --lib

위와 같이 --lib 키워드를 붙여줘야 라이브러리 크레이트를 생성할 수 있다.

그러면 main.rs와 lib.rs가 함께 있으면 어떻게 동작을 할까?

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.rs에 만든 모듈을 main.rs에서 어떻게 불러다가 사용할까?

🔥 [lib] 섹션에서 crate-typecdylib으로 설정하면 main.rs에서 lib.rs의 모듈을 가져다가 사용할 수 없음.

lib.rs

pub fn test_func() {
    println!("test");
}

main.rs

use my_library::test_func;


fn main() {
    test_func();
}

위와 같이 lib.rspub 접근 제한자를 사용하여 test_func를 외부에 노출하겠다고 정의해놓으면 main.rs에서 불러다가 사용할 수있다.

여기서 필자가 헷갈린 부분은 아래와 같다.

use my_library::test_func;

여기서 my_libraryCargo.toml 파일에서 정의해놓은 libname이다.

현재 프로젝트에서는 libname을 정의해 놓았지만 만약 default로 설정해놓는다면 lib.rsmain.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::를 사용해야 합니다.

lib.rs이외의 다른 .rs파일에서 사용하기 위해서는?

다음에 알아보겠다.

0개의 댓글