(출처) http://www.learncpp.com/cpp-tutorial/a1-static-and-dynamic-libraries/
--> 한글 번역안
A.1 - 정적, 동적 라이브러리
라이브러리란 여러 프로그램들에 의해 재상용되는 코드의 집합입니다. 전형적으로는 c++라이브러리는 두가지 부류로 존재합니다.
1) 프로그램에서 사용되기 위해 기능을 정의한 헤더파일
2) 함수 구현부를 기계어로 precompile한 바이너리 파일
라이브러리는 여러 파일로 존재할 수도 있고 여러개의 헤더파일을 갖기도 합니다.
라이브러리가 precompile되는 이유는 다음의 몇가지가 있습니다. 우선, 라이브러리는 거의 수정되지 않습니다. 따라서 자주 재컴파일 될 필요도 없습니다. 때문에 라이브러리를 사용하는 프로그램을 개발하는 과정에서 해당 라이브러리를 계속해서 컴파일하는 것은 시간낭비라고 할 수 있습니다. 라이브러리를 미리 컴파일하는 다음 이유는 미리 컴파일된 object파일은 기계어로 이루어져있기 때문에 사용자가 접근하거나 소스파일을 변경하지 못합니다. 이는 소스코드의 지적 재산권 관련 문제와 관련해 매우 중요한 비즈니스적 성격을 띕니다.
이제 라이브러리의 두가지 종류에 대해서 알아봅시다. : 정적라이브러리와 동적라이브러리입니다.
정적 라이브러리는 (아카이브로도 알려져있습니다.) 통상적으로 컴파일되고 프로그램에 직접 링크됩니다. 정적 라이브러리를 사용하는 프로그램을 컴파일 할 경우, 정적 라이브러리 안의 모든 함수들이 실행파일의 일부가 됩니다. 윈도즈 환경에서, 정적 라이브러리는 일반적으로 .lib 확장자를 갖고 리눅스 환경에서는 .a(archive)확장자를 갖습니다. 정적라이브러리의 사용상 이점이라고 한다면, 프로그램을 실행하려면 단지 실행파일만 배포하면 된다는 것입니다. 라이브러리가 프로그램에 포함되기 때문에 항상 정확한 버전의 라이브러리를 사용해야 합니다. 또한, 정적 라이브러리가 프로그램의 일부가 된 만큼, 프로그램상에서 해당 함수는 반드시 해당 기능으로만 사용할 수 있습니다. 이 때문에 발생되는 비효율은 정적라이브러리를 사용하는 모든 실행파일에 대해서 정적라이브러리 파일이 복사되어 들어가기 때문에 많은 메모리 공간 낭비가 발생한다는 점입니다. 정적 라이브러리도 업그레이드될 수 있는데 이때는 실행파일 전체가 교체되어야 합니다.
동적라이브러리(공유라이브러리라고도 불림)는 프로그램의 런타임시에 메모리에 로드되는 구조입니다. 동적라이브러리를 사용하는 프로그램을 컴파일하면, 라이브러리 자체는 실행파일에 포함되지 않고 분리된 상태로 존재합니다. 윈도즈 환경에서는 .dll (동적 링크 라이브러리) 확장자를, 리눅스환경에서는 .so(공유 오브젝트)확장자를 갖습니다. 동적라이브러리를 사용하면 여러 프로그램이 하나의 복사본을 공유하고 때문에 공간을 절약할 수 있습니다. 동적라이브러리를 사용하는 제일 큰 장점은 아마도 라이브러리를 새로운 버전으로 업그레이드 하는데 있어서 그것을 사용하는 실행파일을 전혀 교체할 필요가 없다는 것입니다.
동적라이브러리는 프로그램에 링크되지 않기 때문에, 동적 라이브러리를 사용하기 위해서 프로그램은 명시적으로 동적라이브러리를 로드해야하고 접속해야합니다. 이 메카니즘은 다소 혼란스러울 수 있고 다소 이상해 보일 수 있습니다. 동적라이브러리를 쉽게 사용하기 위해서는 import라이브러리를 사용하면 좋습니다.
import 라이브러리는 동적 라이브러리를 자동으로 로딩하여 사용할 수 있도록 합니다. 윈도즈 환경에서는 보통 small static library(.lib)를 통해 이루어지는데 동적 라이브러리와 동일한 확장자를 갖습니다. 이 static library는 컴파일시 프로그램과 링크되어 동적라이브러리의 함수들이 마치 정적 라이브러리에 있는 것처럼 사용될 수 있도록 합니다. 리눅스 환경에서, 공유 오브젝트(.so)파일은 동적라이브러리와 import 라이브러리 두개로 존재합니다. 거의 대부분의 링커들은 동적 라이브러리를 생성할 때 import라이브러리를 함께 빌드합니다.
댓글 없음:
댓글 쓰기