라이브러리 (Library)

 

함수, 데이터, 타입 등 여러가지 프로그래밍 요소들의 집합이며 보통 lib 확장자를 가진다.

자주 사용되는 함수를 매번 직접 작성해서 사용하는 것은 비생산적인 작업이므로 표준화할 수 있는 함수를 미리 만들어서 모아 놓은 것이 라이브러리이다.

 

이 라이브러리를 프로그램에 링크시키는 방식에 정적 링크와 동적 링크가 있는데 동적 링크 방식을 사용하면 DLL이 된다.

 

 정적 링크 (Static Link)

 

  컴파일 시 라이브러리의 코드를 실행 파일에 복사한다. 때문에 실행 파일의 크기는 커지지만 실행 파일은 단독 실행 파일이 된다.

  컴파일이 끝나면 라이브러리 파일(.lib)이 없어도 프로그램을 실행시킬 수 있다.

 

 동적 링크 (Dynamic Link)

 

  실행 시에 라이브러리가 실행 파일에 연결된다.

  실행 파일에는 호출할 함수의 정보만 포함되고 실제 함수 코드는 복사되지 않으므로 실행 파일의 크기가 작아진다.

  실행 파일에는 실제 라이브러리 코드가 없기 때문에 프로그램 실행 시 DLL이 반드시 있어야 한다.

 

 동적 링크 장점

 

  여러 프로세스가 메모리에 있는 하나의 DLL 복사본을 공유하여 하나의 DLL을 동시에 사용할 수 있다.

  반면, 정적 연결 라이브러리를 사용하여 빌드된 응용 프로그램의 경우 Windows는 각 응용 프로그램에 대해 하나의 라이브러리 코드

  복사본을 메모리에 로드해야 한다.

 

  디스크 공간을 절약할 수 있다. 여러 응용 프로그램이 디스크에 있는 하나의 DLL 복사본을 공유할 수 있다.

  반면, 정적 연결 라이브러리를 사용하여 빌드된 응용 프로그램의 경우에는 각 응용 프로그램마다 별도의 복사본으로서 실행 가능한

  이미지에 링크되는 라이브러리 코드가 있다.

 

  DLL을 보다 쉽게 업데이트 할 수 있다. DLL의 함수가 변경되어도 이 함수의 인수 및 반환 값이 변경되지 않았으면 그 함수를 사용하는

  응용 프로그램을 다시 컴파일하거나 링크할 필요가 없다.

 

  반면, 정적으로 링크되는 개체 코드의 경우에는 함수가 변경되면 응용 프로그램을 다시 링크시켜야 한다.

 

DLL 관리

 

DLL은 가상 메모리에 한 번 로드되면 다시 로드 되지 않는다.

DLL이 메모리에서 삭제되어야 할 시기는 DLL을 사용하는 모든 응용 프로그램이 종료되었을 때이다.

윈도우즈는 DLL별로 사용 카운트(참조 카운트)라는 것을 이용하여 해당 DLL을 사용하는 응용 프로그램이 실행될 때마다 카운트를

1 증가시키고 응용 프로그램이 종료될 때마다 카운트를 1 감소시킨다.

그러다 카운트가 0이 되었을 때 메모리가 삭제된다.

 

DLL Export, Import

 

 Export

 

  함수를 제공하는 DLL에서는 자신이 제공하고자 하는 함수에 대한 정보를 밖으로 공개해야 하며 이 동작을 Export라 한다.

  __declspec은 함수에 대한 정보를 제공하는 선언문이며 Export할 함수 원형 앞에 집어넣으면 된다.

 

1
2
3
4
extern "C" __declspec(dllexportint Add(int a, int b)
{
    return a+b;
}
cs

 

 Import

 

  반대로 DLL을 사용하는 응용 프로그램에서는 어떤 DLL에 있는 어떤 함수를 사용하겠다고 선언해야 하는데 이 동작을 Import라고 한다.

  응용 프로그램에서 사용할 DLL 함수를 아래와 같이 Import하여 사용할 수 있다.

 

1
extern "C" __declspec(dllimportint Add(intint);
cs

 

Import Library

 

DLL을 사용할 프로그램은 자신이 Import할 함수가 어느 DLL에 있는지 알아내기 위해 Import Library를 사용한다.

Import Library는 DLL에서 Export 되는 함수에 대한 정보는 물론 이 함수의 코드가 어떤 DLL에 정의되어 있는지에 대한 정보를 가지고 있다.

단, 함수에 대한 정보만 가지고 있을 뿐 함수의 코드는 가지고 있지 않다.

그래서 응용 프로그램은 링크 시에 Import Library(.lib)를 링크해야 하며 Import Library가 지정하는 DLl 파일을 실행시에 읽어와야 한다.

 

Import Library는 함수에 대한 위치 정보만 가지고 있으므로 컴파일 할때만 필요하며 프로그램 실행과는 아무 상관이 없다.

그래서 DLL 배포시에는 .dll File만 배포하면 된다.

 

MyProject 라는 DLL 생성 프로젝트를 컴파일하면 MyProject.dll (DLL)과 MyProject.lib (Import Library) 두 개의 파일이 생긴다.

 

참고 자료

http://stdesignstar.tistory.com/tag/dll

 

 

'Programming > Knowledge' 카테고리의 다른 글

컴퓨터에 수가 저장되는 방법.  (0) 2017.04.20

+ Recent posts