API

확장 dll 만들기 및 lib 파일 존재 이유

디버그정 2008. 8. 29. 04:41

Lib 파일에 대한 존재 이유

DLL의 링크
 

 
호출하는 방법은 implicit 과 explicit 방법이 있는데
우선 여기선 조금쉬운 방법인 implicit방법을 먼저 하자
위에서 DLL을 만들때 같이 만들어 지는 lib를 이용한다.
 
여기서 lib에 대해 언급하면...
링크될때 링커는 이 lib파일을 표준 라이브러리 처럼 다루어 처리하지만, dll을 끌어오는
lib파일은 dll이 익스포트한 함수 각각에 대한 stub(함수 호출에 쓰이는 정보를 일컬음)만을 포함
 
함수 스텁은 사실 진짜 함수와 동일한 이름과 인수 리스트를 가진 pseudo 함수로서,
내부를 살펴보면 스텁에 필요한 모든 인수를 넘겨서 DLL에 들어있는 진짜 함수를 호출하는
짤막한 코드가 들어있다.
이렇게하면 DLL의 함수를 분리된 파일이 아니라, 애플리케이션 코드의 일부인 것처럼
다루게 된다
 
LIB 파일을 임포트 라이브러리라고 부른다.
 
 

<2>DLL의 링크

DLL를 링크하는 방법은 Implicit 링킹과 Explicit 링킹 두가지 방법이 있습니다.

(1)Implict 링킹

“DLL이 있어서 DLL이 바로 동적 링크되는데 LIB 파일이 왜 필요한가?”

이렇게 물어보는 사람도 있을 것입니다. 이유는 메인프로그램을 컴파일하고 링크할 때 DLL 안에 있는 함수들은 메인프로그램에는 어느 것과도 링크되어 있지 않아 실행 파일로 만들 때 에러가 나오기 때문입니다. 예를 들어, PaintImage(LPSTR  filename);이라는 함수를 DLL로 만들어 놓고 메인프로그램에서 헤더에 extern "C"__declspec(dllimport)void PaintImage(LPSTR filename);이라고 정의하면 컴파일은 하지만 링크할 때 PaintImage 함수를 찾을 수 없다고 하며 에러를 리턴하고 실행 파일을 만들 수 없게 됩니다. 따라서, PaintImage라는 함수를 가상으로 만들어 그것을 0으로 설정해 주는 하나의 함수가 있어야 합니다.


void PaintImage(LPSTR  fileanem)=0;


이렇게 만들어진 함수가 컴파일되어 LIB로 만들어집니다. 따라서, 메인프로그램에서는 실행 내용이 아무것도 들어 있지 않은 LIB를 프로젝트에 삽입하고 컴파일하는 것이죠. 그런 후 프로그램이 실행되면 LIB에 설정된 파일명에 따라 DLL을 로드하고 프로그램 메모리 안에 DLL에서 로드시킨 PaintImage 모듈을 삽입시키게 됩니다. 결국 우리는 DLL을 만들고 난 후 3가지의 파일을 이용해서 메인프로그램을 제작하게 되는 것입니다. 이 3가지 파일은 다음과 같습니다.


① 실질적으로 프로그램이 실행될 때 로드되는 DLL 파일(*.DLL)

② 컴파일할 때 설정해 주는 함수명이 들어 있는 헤더 파일(*.H)

③ 링크할 때 메인프로그램에 빈 함수를 설정하는 LIB 파일(*.LIB)