AIX ar 아카이브를 이용하여 정적 라이브러리 컴파일 방법 (static, *.a)
우선 기본적으로 유닉스에서 정적 라이브러리를 만드는 방법은 간단하다.
ar 를 사용해서 생성하는데 이는 AIX 뿐만 아니라 모든 유닉스/리눅스가 동일할 것이다.
단 ar 옵션의 차이는 있다.
아래와 같은 함수가 포함된 3개의 파일을 정적 라이브러리로 만들어서 실제 사용하는 부분까지 확인해보도록 하자.
파일 명 : f1.c
-------------------------------------------------------
#include<stdio.h>
int funcreturnzero()
{
return 0;
}
-------------------------------------------------------
파일 명 : f2.c
-------------------------------------------------------
#include<stdio.h>
void funcnewline()
{
printf("\n");
}
-------------------------------------------------------
-------------------------------------------------------
#include<stdio.h>
int funcreturnone()
{
return 1;
}
-------------------------------------------------------
$ xlc -c f1.c f2.c f3.c
$ ls
f1.o, f2.o, f3.o
2) libtest.a 라이브러리로 세 개의 파일을 아카이브
$ ar -vq libtest.a f1.o f2.o f3.o
ar: 아카이브 파일 libtest.a을(를) 작성합니다.
q - f1.o
q - f2.o
q - f3.o
$ ls
f1.o, f2.o, f3.o libtest.a
3) 아카이브 내부 오브젝트 파일을 보려면 -t 옵션을 주면 되며 -v 옵션을 주면 상세 옵션이 추가적으로 표시된다.
$ ar -t libtest.a
f1.o
f2.o
f3.o
$ ar -v -t libtest.a
rw-r--r-- 202/201 956 1월 9일 15:42 2014 f1.o
rw-r--r-- 202/201 1125 1월 9일 15:42 2014 f2.o
rw-r--r-- 202/201 953 1월 9일 15:42 2014 f3.o
만약 기존의 libtest.a 라이브러리가 없었다면 위 명령은 libtest.a 라이브러리를 새로 만들고 여기에 f1.o, f2.o, f3.o 오브젝트의 복사본을 넣는다.
그러나 기존의 libtest.a 라이브러리가 이미 있었다면 이 명령은 라이브러리 내에 함수 정의나 변수가 겹치는지 검사하지 않은 채로 기존의 라이브러리 뒤에 오브젝트 파일을 추가한다. -v 옵션은 verbose 옵션이며 ar 명령이 진행되는 상태를 보여준다.
4) 아카이브에 새 오브젝트를 추가하러나 기존 멤버를 바꾸려면 -r 옵션을 사용하면 된다.
$ ar -v -r libtest.a f1.o f4.o
5) 바뀐 멤버를 갱신하려면 -r -u 옵션을 추가.
$ ar -v -r -u libtest.a f2.o
6) 아카이브 내부 멤버 오브젝트를 추출하려면 -x 옵션.
$ ar -v -x libtest.a f1.o f3.o
7) 아카이브 내부 멤버 오브젝트를 제거하려면 -d 옵션.
$ ar -v -d libtest.a f2.o
단 해당 부분은 모두 정적 오브젝트에 해당한다.