Passion/Programming

정적라이브러리

sunshout 2007. 1. 9. 14:36
우리가 프로그램을 보면서 쉽게 접할 수 있는 xxxx.a 의 형식으로 된 파일을 말한다.
정적라이브러리는 단순히 오브젝트파일들의 묶음으로 보면 된다.
우리가 어떤 C파일을 오브젝트 코드(xxx.o)로 컴파일하고 나서 이런 오브젝트 파일들을
압축툴(ar)을 이용하여 하나의 정적라이브러리 파일로 생성하는 것이다.

이는 최근에는 많이 사용되지 않는 방법이지만, 라이브러리는 공개하고 소스는 공개하고 싶지않을 때 사용하는 방법이라고 보면 된다.

장점 : 정적 라이브러리는 사용자들이 프로그램을 다시 컴파일하지 않아도 링크시킬수 있도록 해주기 때문에, 컴파일 시간을 줄여준다.

정적 라이브러리를 만드는 방법 : ar rcs mylibrary.a file1.o file2.o
이 예제 명령은 오브젝트 파일 file1.o, file2.o를 정적 라이브러리mylibrary.a에 추가하고, 만약 mylibrary.a가 존재하지 않는다면 만드는 것이다. 정적 라이브러리를 만드는것에 대해 더 많은 정보를 보려면 ar(1)을 참조하라.

==== 따라하기 ====
라이브러리 파일 (libhello.c)
[CODE type=C]
/* libhello.c */

#include <stdio.h>

void hello(void)
{
       printf("Hello, library world.\n");
}
[/HTML][/CODE]

라이브러리 컴파일 : gcc -Wall -g -c -o libhello.o libhello.c

Static Library로 만들기 : ar rcs libhello-static.a libhello.o

라이브러리를 사용하기 위한 헤더 파일
[CODE type=C]
/* libhello.h */

extern void hello(void);
[/HTML][/CODE]

어플리케이션 예제
[CODE type=C]
#include "libhello.h"

int main(void)
{
       hello();
       return 0;
}
[/HTML][/CODE]

어플리케이션 컴파일 : gcc -Wall -g -c -o hello.o hello.c
라이브러리와 함께 링크하기 : gcc -Wall -g -o hello hello.o -L. -Ihello-static

-L 옵션은 라이브러리가 디폴트 패스에 존재하지 않기 때문에 라이브러리의 위치를 현재 디렉토리(.)로 명시하는 것이고, -lhello-static 은 libhello-static.a 라이브러리를 포함한다라는 의미이다.
라이브러리의 이름은 libhello-static.a 인데 앞에 lib 와 뒤에 .a 는 빼고 적는다.

소스코드
http://sunshout.googlecode.com/svn/trunk/Programming/static_library/