정적라이브러리 - 동적(공유)라이브러리에 비해 실행 속도가 빠르고 배포에 제약이 없음 - 다만, 해당 라이브러리를 필요로 하는 모든 경우 같은 정적 라이브러리가 링크되기 때문에 배포 파일들의 사이즈가 커짐 - 그러므로 하드디스크 공간도 더 차지하고 메모리도 더 많이 차지함 - 그러나 유닉스 시스템의 경우 그때그때 필요한 부분만 메모리에 로딩하는 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'참조
'UTIL' 카테고리의 다른 글
wave pcm 파일 구조 (0) | 2013.08.29 |
---|---|
int32_t int64_t (0) | 2013.08.29 |
fscanf fgets (0) | 2013.08.27 |
WAV TO PCM (0) | 2013.08.27 |
Ubuntu on Android without vnc (0) | 2013.08.23 |