{{위키데이터 속성 추적}}
'''정적 라이브러리'''({{lang|en|Static Library}})는 [[컴파일 타임]]에 호출자가 resolve 하는 루틴, 외부 함수, 변수의 집합으로 [[목적 파일]]과 단독 실행 파일 생성 중에 [[컴파일러]]와 [[링커 (컴퓨팅)|링커]]에 의해 대상 애플리케이션에 복사된다.<ref name="Static Libraries">{{웹 인용
 |title=Static Libraries
 |url=http://tldp.org/HOWTO/Program-Library-HOWTO/static-libraries.html
 |publisher=TLDP
 |accessdate=3 October 2013}}</ref> 실행 파일을 이와 같은 방식으로 컴파일 하는 과정 또는 실행 파일 그 자체를 프로그램의 [[정적 빌드]]라고 부른다. 역사적으로 라이브러리는 정적(static)일 수만 있었다. 정적 라이브러리는 빌드/링크 과정에서 하나의 [[실행 파일]]을 만들기 위해 다른 정적 라이브러리 또는 [[목적 파일]]과 통합되거나, [[런타임]] 시점에 대응하는 실행 파일의 [[주소 공간]]에서 컴파일 타임/[[링크 타임]]동안 결정된 [[정적 변수|정적 메모리 오프셋]] 위치에 로드된다.

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

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

정적 링킹에서는 라이브러리 코드가 실행 파일 내에 저장되기 때문에, 실행 파일의 크기는 분리된 파일에 저장하는 동적 링킹 때 보다 커진다. 그러나 라이브러리 파일들이 애플리케이션의 부분으로서 세어진다면, 전체 크기는 비슷하거나 컴파일러가 사용되지 않은 심볼들을 제거한 경우에는 더 작아질 수 있다. [[마이크로소프트 윈도우]]에서 애플리케이션이 필요한 라이브러리 파일들을 포함하는 것은 흔한 일이다.<ref name="endofdllhell">{{웹 인용
 |url          = http://msdn.microsoft.com/library/techart/dlldanger1.htm
 |title        = The End of DLL Hell
 |date         = 2000-01-11
 |archiveurl   = https://web.archive.org/web/20010605023737/http://msdn.microsoft.com/library/techart/dlldanger1.htm
 |archivedate  = 2001-06-05
 |last         = Anderson
 |first        = Rick
 |publisher    = microsoft.com
 |accessdate   = 2013-08-31
 |quote        = ''Private DLLs are DLLs that are installed with a specific application and used only by that application.''
 |url-status = dead
}}</ref> [[유닉스 계열]] 시스템들에서는 패키지 관리 시스템들이 사용 가능한 정확한 라이브러리 파일들을 보장하기 때문에 윈도우보다는 덜 흔한 일이다. 이것은 라이브러리 파일들이 많은 애플리케이션들 사이에서 공유될 수 있게 하며, 공간을 절약한다. 또한 라이브러리를 사용하는 애플리케이션의 업데이트 대신, 라이브러리만을 업데이트함으로써 버그와 보안 결함을 고칠수 있게 한다. 실제로 많은 실행 파일들이(특히 윈도우 용) 정적 라이브러리와 동적 라이브러리들을 모두 사용한다.

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

== C/C++에서 정적 라이브러리 생성 ==
정적 라이브러리들은 [[C (프로그래밍 언어)|C]]나 [[C++]]에서 쉽게 만들어질 수 있다. 이 두 언어들은 외부 또는 내부 링크를 나타내고, 또한 다른 특징들을 제공하기 위해 기억 영역 분류를 제공한다. 이러한 라이브러리를 생성하기 위해서, 익스포트되는 함수/프로시저들과 다른 객체 변수들은 반드시 ''external linkage''로 명시되어야 한다(즉, C <code>static</code> 키워드를 사용해서). 정적 라이브러리 파일 이름들은 보통 [[유닉스 계열]] 시스템에서는 ".a" 확장을 갖고<ref name="Static Libraries">{{웹 인용
 |title=Static Libraries
 |url=http://tldp.org/HOWTO/Program-Library-HOWTO/static-libraries.html
 |publisher=TLDP
 |accessdate=3 October 2013}}</ref> [[마이크로소프트 윈도우]]에서는 ".lib"을 갖는다.

예를 들면 파일들 <code>class1.o</code>, <code>class2.o</code>, <code>class3.o</code>를 사용해서 아카이브를 생성하기 위해서는 아래와 같은 명령어가 사용될 것이다:<ref name="Static Libraries">{{웹 인용
 |title=Static Libraries
 |url=http://tldp.org/HOWTO/Program-Library-HOWTO/static-libraries.html
 |publisher=TLDP
 |accessdate=3 October 2013}}</ref>
 ar rcs libclass.a class1.o class2.o class3.o
<code>class1.o</code>, <code>class2.o</code>, and <code>class3.o</code> 를 사용한 프로그램을 컴파일하기 위해서는:
 cc main.c libclass.a
또는 (만약 libclass.a 가 표준 라이브러리 경로 즉,  <code>/usr/local/lib 같은 곳에 위치한다면</code>)
 cc main.c -lclass
또는 (링킹 동안)
 ld ... main.o -lclass ...
이것 대신에:
 cc main.c class1.o class2.o class3.o

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

== 각주 ==
<references />

{{응용 프로그램 이진 인터페이스}}

[[분류:라이브러리]]