정적 라이브러리

정적 라이브러리()는 컴파일 타임에 호출자가 resolve 하는 루틴, 외부 함수, 변수의 집합으로 목적 파일과 단독 실행 파일 생성 중에 컴파일러와 링커에 의해 대상 애플리케이션에 복사된다. 실행 파일을 이와 같은 방식으로 컴파일 하는 과정 또는 실행 파일 그 자체를 프로그램의 정적 빌드라고 부른다. 역사적으로 라이브러리는 정적(static)일 수만 있었다. 정적 라이브러리는 빌드/링크 과정에서 하나의 실행 파일을 만들기 위해 다른 정적 라이브러리 또는 목적 파일과 통합되거나, 런타임 시점에 대응하는 실행 파일의 주소 공간에서 컴파일 타임/링크 타임동안 결정된 정적 메모리 오프셋 위치에 로드된다.

장점과 단점 
동적으로 링크하는 대신, 정적으로 라이브러리를 실행 파일에 링크하는 것은 여러 가지 장점이 있다. 가장 눈에 띄는 점은 애플리케이션이 자신의 모든 라이브러리들이 존재하고 그것이 정확한 버전인 것을 확신할 수 있다는 점이다. 이것은 DLL 지옥 또는 그 이상의 의존성 지옥으로 알려진, 의존성과 관련된 문제들을 피할 수 있다. 정적 링킹은 또한 애플리케이션이 단일 실행 파일에 포함되게 함으로써 배포와 설치를 간단하게 만든다.

정적 링킹을 통해서 직접 또는 간접적으로 대상 실행 파일(또는 라이브러리)에 참조되는 라이브러리의 부분들을 충분히 포함할 수 있다. 동적 라이브러리를 통해서는 전체 라이브러리가 로드되며, 함수가 애플리케이션에 의해 호출되는 이 방식의 장점은 알려져 있지 않다. 이 장점이 중요한지는 라이브러리의 실제 구조에 달려있다.

정적 링킹에서는 라이브러리 코드가 실행 파일 내에 저장되기 때문에, 실행 파일의 크기는 분리된 파일에 저장하는 동적 링킹 때 보다 커진다. 그러나 라이브러리 파일들이 애플리케이션의 부분으로서 세어진다면, 전체 크기는 비슷하거나 컴파일러가 사용되지 않은 심볼들을 제거한 경우에는 더 작아질 수 있다. 마이크로소프트 윈도우에서 애플리케이션이 필요한 라이브러리 파일들을 포함하는 것은 흔한 일이다. 유닉스 계열 시스템들에서는 패키지 관리 시스템들이 사용 가능한 정확한 라이브러리 파일들을 보장하기 때문에 윈도우보다는 덜 흔한 일이다. 이것은 라이브러리 파일들이 많은 애플리케이션들 사이에서 공유될 수 있게 하며, 공간을 절약한다. 또한 라이브러리를 사용하는 애플리케이션의 업데이트 대신, 라이브러리만을 업데이트함으로써 버그와 보안 결함을 고칠수 있게 한다. 실제로 많은 실행 파일들이(특히 윈도우 용) 정적 라이브러리와 동적 라이브러리들을 모두 사용한다.

링킹과 로딩 
어떤 정적 라이브러리 함수도 다른 정적 라이브러리에서 함수나 프로시저를 호출할 수 있다. 링커와 로더는 다른 목적 파일들과 같이 이것을 같은 방식으로 처리한다. 정적 라이브러리 파일들은 링킹 로더에 의해서 런타임 시에 링크될 것이다.(예를 들면, X11 모듈 로더). 그러나 이러한 과정이 정적 링킹으로 불릴수 있는지에 관해서는 논란이 있다.

C/C++에서 정적 라이브러리 생성 
정적 라이브러리들은 C나 C++에서 쉽게 만들어질 수 있다. 이 두 언어들은 외부 또는 내부 링크를 나타내고, 또한 다른 특징들을 제공하기 위해 기억 영역 분류를 제공한다. 이러한 라이브러리를 생성하기 위해서, 익스포트되는 함수/프로시저들과 다른 객체 변수들은 반드시 external linkage로 명시되어야 한다(즉, C static 키워드를 사용해서). 정적 라이브러리 파일 이름들은 보통 유닉스 계열 시스템에서는 ".a" 확장을 갖고 마이크로소프트 윈도우에서는 ".lib"을 갖는다.

예를 들면 파일들 class1.o, class2.o, class3.o를 사용해서 아카이브를 생성하기 위해서는 아래와 같은 명령어가 사용될 것이다:
 ar rcs libclass.a class1.o class2.o class3.o
class1.o, class2.o, and class3.o 를 사용한 프로그램을 컴파일하기 위해서는:
 cc main.c libclass.a
또는 (만약 libclass.a 가 표준 라이브러리 경로 즉,  /usr/local/lib 같은 곳에 위치한다면)
 cc main.c -lclass
또는 (링킹 동안)
 ld ... main.o -lclass ...
이것 대신에:
 cc main.c class1.o class2.o class3.o

같이 보기 
 라이브러리 (컴퓨팅)
 링커 (컴퓨팅)
 로더 (컴퓨팅)
 공유 라이브러리
 동적 링크 라이브러리 (DLL, .dll)
 외부 변수
 목적 파일

각주 

라이브러리