lib

lib

lib 선언은 하나의 라이브러리에 속하는 C 함수와 타입들을 묶어주는 역할을 해요.

@[Link("pcre")]
lib LibPCRE
end

컴파일러가 강제하지는 않지만, lib의 이름은 보통 Lib로 시작하는 게 관례예요.

외부 라이브러리를 찾기 위해 링커에 플래그를 전달할 때는 어트리뷰트(attribute)를 사용해요:

  • @[Link("pcre")]는 링커에 -lpcre를 전달해요. 다만 컴파일러는 그 전에 pkg-config를 먼저 사용하려고 해요.
  • @[Link(ldflags: "...")]는 그 플래그를 수정 없이 링커에 그대로 전달해요. 예: @[Link(ldflags: "-lpcre")]. 명령을 실행하기 위해 백틱을 쓰는 방법도 흔히 쓰여요: @[Link(ldflags: "`pkg-config libpcre --libs`")].
  • @[Link(framework: "Cocoa")]는 링커에 -framework Cocoa를 전달해요 (macOS에서만 유용해요).

libc의 경우처럼 라이브러리가 암시적으로 링크된다면, 어트리뷰트는 생략해도 돼요.

출처: Crystal 공식 문서

본문

리플렉션 (Reflection)

lib 함수는 프로그램 어디에서든 TypeNode#methods 메서드를 사용해 매크로 언어에서 볼 수 있어요:

lib LibFoo
  fun foo
end

{{ LibFoo.methods }} # => [fun foo]

더 알아보기

  • lib는 C 함수·타입을 묶고, 이름은 관례상 Lib로 시작해요.
  • 링커 플래그는 @[Link] 어트리뷰트로 전달하고, libc처럼 암시적 링크라면 생략 가능해요.
  • 리플렉션을 통해 매크로에서 lib 함수를 확인할 수 있어요.