정적라이브러리

- 동적(공유)라이브러리에 비해 실행 속도가 빠르고 배포에 제약이 없음

- 다만, 해당 라이브러리를 필요로 하는 모든 경우 같은 정적 라이브러리가 링크되기 때문에 배포 파일들의 사이즈가 커짐

- 그러므로 하드디스크 공간도 더 차지하고 메모리도 더 많이 차지함

- 그러나 유닉스 시스템의 경우 그때그때 필요한 부분만 메모리에 로딩하는 demand paging을 사용하기 때문에 정적인 라이브러리의 메모리 사용률과 공유 라이브러리의 메모리 사용률의 차이가 크지 않음


시스템에서 응급시에 필수로 쓰이는 유틸리티와 실행속도를 극대화해야 하는 몇몇 서버를 제외하고는 대부분 동적 라이브러리를 사용한다.



*shared library와 dynamic link library는 다른 개념이다

그러나 대부분의 경우 dynamic link library는 shared library를 만들 때 사용됨



확장자별 라이브러리 종류

*.a: 리눅스/정적 라이브러리

*.so: 리눅스/동적라이브러리

*.lib: 윈도우/정적라이브러리

*.dll: 윈도우/동적라이브러리




정적 라이브러리를 가지고 동적라이브러리로 만들기

a파일(정적라이브러리)에서 o파일(오브젝트)을 뽑아낸 다음 ld로 so타겟으로 해서 만들면된다.

$ar x abc.a

 a.o, b.o, c.o

$gcc -shared -o abc.so *.o //다시 o를 lib로 묶는다



라이브러리와 헤더파일

1. 다르다.

라이브러리는 기계어로 번역된 라이브러리이고,

헤더파일은 컴파일 하기 전의 즉, 프로그래머가 이해할 수 있고 문법에 맞게 작성되어 있는 선언들의 집합이다.


헤더가 여러개 모이는 것 != 라이브러리

컴파일된 산물인 *.o(오브젝트)파일을 여러개 모아 놓은 것 == 라이브러리


라이브러리를 사용하기 위해서 해당 라이브러리의 헤더파일이 있어야한다. 링커가 알아먹을 수 있는 심볼네임을 가지고 라이브러리를 뒤져서 링크를 하게 된다.

컴파일러가 이런 헤더파일을 가지고 심볼네임을 만들어서 오브젝트 파일에 넣어주면 링커가 해당 심볼네임을 가지고 라이브러리를 뒤져서 링크를 하게 된다.



공유와 동적의 차이

- 두개의 차이를 특별히 나누지 않는다. 다만 동적lib를 공유방식으로 사용하느냐, 독립적으로 사용하느냐는 메모리에 load할 때 결정된다. 'man dlopen'참조



출처: http://ndlessrain.tistory.com/entry/라이브러리-a-파일-so-파일 [ndlessrain]

'관련TIP' 카테고리의 다른 글

커널 모듈의 관리  (0) 2018.02.07
정규표현식 정리  (0) 2017.12.23

+ Recent posts