본문 바로가기

프로그래밍/C++

lib와 dll 라이브러리(library)

라이브러리란?

 : 여러 프로그램에서 자주 사용하는 함수와 데이터들을 실행이 가능한 바이너리 형태로 묶어놓은 것

 

1. 정적 라이브러리 (Static Link Library)

 : 실행파일 안에 라이브러리가 하나로 묶인다.

   실행파일의 크기는 커지지만 실행파일만 있으면 어느 곳에서나 실행이 가능하다.

   프로그램 실행 후 처리시간이 빠르다.

   .lib 파일의 형태로 생성된다.

 

2. 동적 라이브러리 (Dynamic Link Library)

 : 실행파일 안에 포함되지 않고, 프로그램 실행 시에 참조된다.

   실행파일의 크기가 작다.

   .dll 파일의 형태로 생성된다.

   물리 메모리에 한번 올라간 dll은 둘 이상의 프로세스가 각각 자신의 가상 메모리에 매핑해서 공유하는 구조를 지니       기  때문에 메모리 사용에 대한 효율성이 높다.

   런타임 중에 필요할 때 외부 dll 파일에서 참조한다.

 

__declspec(dllimport)

 : dll으로부터 제공받을 함수를 선언할 때 사용한다.

__decelspec(dllexport)

 : 외부에 제공할 함수를 선언할 때 사용한다.

/* SwapDll.h */
__declspec(dllimport)
void swap(int* v1, int* v2);

/* SwapDll.cpp */
__declspec(dllexport)
void swap(int* v1, int* v2)
{
    int temp = *v1;
    *v1 = *v2;
    *v2 = temp;
}

 

dll을 만들 때, lib도 같이 생성되는데 그 이유는

 : 만들어진 lib는 정적 라이브러리의 역할을 하는 것이 아니고, dll이 제공하고자 하는 함수 정보를 가지고 있다.

 

컴파일은 호출하고자 하는 함수의 선언부만 있으면 되지만, 실행파일의 생성은 선언에 대한 정의가 완전히 존재해야 만들어진다.

(실제로 선언부만 존재한 형태로 컴파일을 하면 링크에러가 발생한다.)

이러한 문제점을 해결하기 위해 dll이 만들어질 때, lib도 같이 만들어진다

dll을 생성할 때 함께 만들어지는 lib 파일에는 링커가 실행파일을 만드는데 필요한 정보가 담겨 있다.

-> lib 파일은 링크할 때 필요하고, dll 파일은 실행할 때 필요하다.

 

dll의 중요한 점

 : 정적 라이브러리와는 달리 클래스라고 치면 객체를 하나만 만들고, 그 녀석의 포인터를 가져다 쓴다고 생각하면 된다.

   코드만 가져다쓰고, exe에 포함되지 않는다.

 

dll로 뽑아내고 싶은 함수를 골라서 뽑을 수 있다.

'프로그래밍 > C++' 카테고리의 다른 글

메모리 단편화  (0) 2019.07.17
객체지향 개발 5대 원리 : SOLID  (0) 2019.07.09
메모리 단편화  (0) 2019.07.08
LSB, MSB  (0) 2019.07.07
메모리의 구조  (0) 2019.07.06