본문 바로가기

Computer/Linux-Others & Etc

정적라이브러리(.a) 와 공유라이브러리(.so)

# 이 글은 싸이월드 블로그에 내가 작성했던 글을 옮겨온 글이다. #

 

 

 

정적라이브러리 공유라이브러리
확장자 .a .so(IBM) 이나 .sl(HP)
라이브러리 로직변경시 반영방법 재컴파일 후 재실행 컴파일 없이 재실행
작성방법 ar cc
실행속도 상대적 빠름 상대적 느림


.a[정적라이브러리]
: 컴파일 시간에 코드를 포함하여 결정하기 때문에 정적 라이브러리라고 함.

test.o 파일과 app.o 파일이 생기는데 test.o 파일을 Archive로 묶어 보자. 라이브러리 파일의 작명법은 lib뒤에 이름을 붙이는 것이다.
# ar cr libtest.a test.o

libtest.a 파일이 생성되었을 것이며 이 라이브러리를 사용하여 컴파일 할려면 아래와 같이 한다. -L은 라이브러리 파일의 위치를 지정하며 -ltest가 libtest.a를 지정하게 된다.
#gcc -o app app.o -L. -ltest

.so[동적라이브러리]
: 실행 시간에 라이브러리 파일을 찾아 코드를 포함하기 때문에 동적라이브러리라고 함.
즉, 정적 라이브러리는 컴파일 시간에 코드를 결정하기 때문에 소스가 변경되면 새로 컴파일 해야하지만,
동적 라이브러리의 경우 라이브러리만 교체하는 것으로도 변경이 가능하다.

# gcc -c -fPIC test.c
# gcc -c app.c

-fPIC옵션은 Position-Independent Code의 약자이며 test.o파일을 동적라이브러리로 사용하도록 컴파일 하는 옵션이다. 이렇게 컴파일된 오브젝트 파일을 .so파일로 묶으면 된다.
# gcc -shared -fPIC -o libtest.so test.o
-shared 공유 오브젝트를 생성

컴파일은 아래와 같이 하면 된다.
# gcc -o app app.o -L. -ltest

만일 libtest.a 파일과 libtest.so 파일이 같이 있을 경우 gcc 컴파일러는 libtest.so 파일을 먼저 지정하게 된다. 만일 libtest.a를 사용하여 컴파일 하고 싶으면 아래와 같이 실행하면 된다.
# gcc -static -o app app.o -L. -ltest


라이브러리

이렇게 단위 함수를 별개의 소스코드와 헤더파일로 나누어서 관리하게 되면, object 혹은 단위 소스코드 파일을 재활용할 수 있다는 장점을 가진다. 그러나 여전히 불편한 점이 있다. 함수가 많아지면, 자칫 수십개의 오브젝트 파일이 생성될 수 있을건데, 이들을 관리하는건 매우 귀찮은 일이기 때문이다.

그렇다면 4개의 object 파일을 하나로 묶을 수만 있다면, 함수들을 더 편리하게 관리할 수 있을 것이다. 이렇게 오브젝트들을 하나의 파일로 다시 묶은 것을 라이브러리(library)라고 한다.

라이브러리는 다시 정적 라이브러리동적 라이브러리로 나뉜다. 정적라이브러리는 실행파일에 완전히 포함되어버리는 형식의 라이브러리를 말한다. 반면 동적 라이브러리는 실행파일에 포함되지 않고, 실행될때 해당 라이브러리를 불러오는 형식의 라이브러리를 말한다.

아래의 그림을 보자.

.a는 정적 라이브러리를 나타낸 것이다. 포함한다고 위에 명시 되어있다.
.so는 동적 라이브러리를 나타낸 것이고, 링크로 연결 되어진다.