extern crate 선언
extern crate 선언
내가 만든 코드에 다른 크레이트(crate)를 가져다 쓰고 싶을 때가 있어요. Rust에서는 그럴 때 extern crate 선언을 사용해요. 외부 크레이트에 대한 의존성을 지정하는 문법이에요.
출처: Rust Reference
본문
구문 (Syntax)
ExternCrate → extern crate CrateRef AsClause? ;
CrateRef → IDENTIFIER | self
AsClause → as ( IDENTIFIER | _ )
개념 (Intro)
extern crate 선언은 외부 크레이트에 대한 의존성을 지정해요. 그러면 그 외부 크레이트가 타입 네임스페이스(type namespace) 에서 주어진 식별자로 선언된 스코프에 바인딩(binding) 되어요.
추가로, extern crate가 크레이트 루트(crate root) 에 나타나면 크레이트 이름이 extern 프렐류드(extern prelude) 에도 추가돼요. 그러면 모든 모듈에서 자동으로 스코프 안에 들어오게 되죠.
as 절(clause)을 쓰면 가져온 크레이트를 다른 이름으로 바인딩할 수 있어요.
이름 해석 (Lookup)
외부 크레이트는 컴파일 타임에 특정 soname(공유 라이브러리 이름) 으로 해석돼요. 그리고 그 soname에 대한 런타임 링크 요구사항이 링커로 전달되어 런타임에 로딩돼요. soname의 해석은 컴파일 타임에 이뤄지는데, 컴파일러의 라이브러리 경로를 훑어서, 제공된 선택적 crate_name을 그 외부 크레이트가 컴파일될 때 선언했던 crate_name 속성 값과 대조해 찾아요. 만약 crate_name이 제공되지 않으면, extern crate 선언에 주어진 식별자와 같은 기본 이름 속성이 가정돼요.
self 크레이트도 가져올 수 있는데, 이 경우 현재 크레이트에 대한 바인딩을 만들어요. 이때는 반드시 as 절로 바인딩할 이름을 지정해야 해요.
extern crate 선언의 예시 세 개를 볼게요.
extern crate pcre;
extern crate std; // equivalent to: extern crate std as std;
extern crate std as ruststd; // linking to 'std' under another name
이름 제한 (Name restrictions)
Rust 크레이트 이름을 지을 때 하이픈(-)은 허용되지 않아요. 그런데 Cargo 패키지는 하이픈을 쓸 수 있어요. 이런 경우, Cargo.toml이 크레이트 이름을 명시하지 않으면 Cargo가 -를 _로 투명하게 바꿔 줘요 (RFC 940 참조).
// Importing the Cargo package hello-world
extern crate hello_world; // hyphen replaced with an underscore
밑줄 가져오기 (Underscore imports)
외부 크레이트 의존성은 이름을 스코프에 바인딩하지 않고 선언할 수도 있어요. extern crate foo as _ 형태로 밑줄을 쓰는 거예요. 이는 링크만 필요하고 참조될 일이 없는 크레이트에 유용해요. 이러면 미사용(unused)으로 신고되는 것도 피할 수 있어요. macro_use 속성은 평소처럼 동작해서 매크로 이름을 macro_use 프렐류드로 가져와요.
no_link 속성
no_link 속성을 extern crate 아이템에 적용하면 해당 크레이트를 링크하지 않도록 만들 수 있어요. 예를 들어 크레이트의 매크로만 필요할 때 도움이 돼요.
#[no_link]
extern crate other_crate;
other_crate::some_macro!();
no_link 속성은 MetaWord 문법을 사용해요. 그리고 extern crate 선언에만 적용할 수 있어요. 참고로 rustc는 다른 위치에서의 사용은 무시하지만 그에 대해 린트(lint)해요. 이건 나중에 오류가 될 수도 있어요. 또 한 가지, no_link는 extern crate 선언에서 첫 번째 사용만 효과가 있어요. 이후에 오는 사용에는 rustc가 린트를 발생시키는데, 이것도 나중에 오류가 될 수 있어요.
더 알아보기 (Learn more)
- Rust Reference - Extern crate declarations — 본문 원문
- Rust Reference - Items — 크레이트 선언이 속한 아이템 전체