프로그래밍 - DLL만들기
VC++6.0 기준
Lib파일로 DLL을 만들 수 있을까?
------------------------------
가능해 보임
DLL을 Lib로 만들 수 있을까?
---------------------------
된다고 함.
exe를 Lib로 만들 수 있을까?
--------------------------
될것 같음
기존 소스를 최소한의 수정으로 DLL을 만드는 방법은?
-------------------------------------------------
DLL을 만들려면, dllexport, dllimport 매크로를 기존 함수 앞에 붙여줘야한다.
소스파일이 너무 많은 경우, 함수마다 일일이 다 붙여주기도 힘들다.
LIB_DLL_API 매크로는 해당 함수가 DLL에서 외부로 보여지게 만들어 준다.
표시가 없는 경우, DLL내부에 존재는 하지만, 외부에서 해당함수를 찾아서 사용할 수 없다.
#ifdef LIB_DLL_EXPORTS
#define LIB_DLL_API __declspec(dllexport)
#else
#define LIB_DLL_API __declspec(dllimport)
#endif
1) 헤더파일에만 표시해줘도 된다.
소스파일에는 표시 안해도 됨.
실행파일에서 DLL링크 방법
-------------------------
DLL을 만들때, Lib파일도 같이 만들어진다.
VC++6.0 에서는 DLL파일이 만들어지는 경로는 지정할 수 있으나,
Lib파일이 만들어지는 경로는 Debug나 Release로 고정된듯하다.
아래와 같이 Lib 파일을 지정경로(개인용 Lib)로 복사하는 파일을 만들어 두고, 컴파일 후, 한번씩 실행해준다.
(컴파일 후, 자동으로 실행해주는 기능은 없는듯함)
//copy lib to Lib.bat
copy D:\C\Lib_DLL\Debug\aD.lib D:\C\Lib\aD.lib
copy D:\C\Lib_DLL\Release\a.lib D:\C\Lib\a.lib
정적링크/동적링크
------------------
1) 정적링크
실행파일을 만들때, DLL만들때 생성된 Lib파일을 참조하여,
exe파일 실행시, DLL파일의 함수들을 한꺼번에, 자동으로 끌어오는 방법이다.
exe파일 실행시, DLL파일이 없다면, 에러를 내뿜고 종료된다.
2) 동적링크
exe파일에서, 필요시, DLL파일의 특정함수를 끌어오는 기능이다.
사용자가 GetProcAddress, LoadLibrary함수를 사용해서, 각 함수별로 끌어와야한다.
함수포인터변수를 만들고, 해당함수의 주소를 불러오는것이다.
함수 포인터 변수(함수별로 각각 모양이 다름)+함수명(문자열)+끌어오는 코드가 필요함.
exe파일 실행시, DLL이 없는 경우 사용자가 에러를 핸들링할 수 있다.
동적링크는 주로, 윈도우의 시스템 DLL에 있는 함수를 끌어올때 사용한다.
디버그용과 릴리즈용 DLL 구분
----------------------------
디버그용과 릴리즈용 DLL을 만들어야 디버깅이 편하다.
디버그용은 소스가 있다면, DLL 내부까지 디버깅이 가능하다.
보통 디버그용은 파일명 뒤에 'D"를 붙인다.
exe파일에서 DLL정적 링크
-----------------------------
#include "..\Lib\a_DLL.h"
#ifdef _DEBUG
#pragma comment(lib, "a_DLLD.lib")
#else
#pragma comment(lib, "a_DLL.lib")
#endif
기존에 만들어둔 Lib파일을 일괄적으로 DLL로 변환할 수 있을까?
----------------------------------------------------------
헤더파일에 함수명앞에 DLL EXPORT 매크로만 추가하면 됨(?)
DLL파일을 사용함으로써 장점,단점
--------------------------------
1) 장점
- 컴파일 시간 감소(Lib와 동일)
- 기존 Lib 파일 대비, 링크 시간 감소
- 여러개의 프로그램이 있을때, DLL하나만 업데이트하여, 모든 프로그램의 성능이 개선될 수 있음.
- 윈도우에서 DLL은 1개만 로드하므로, 여러개의 프로그램이 동시에 실행되고, 동일한 기능을 DLL로 묶을 경우,
DLL파일 크기만큼 메모리가 절약되나, 3G정도의 메모리를 사용하는 요즘에는 1M크기의 DLL은 아무런 이득이 안됨.
2) 단점
- 프로그램 수정시, exe, DLL 2가지중에 어느것을 업데이트 해야할지 복잡해짐.
exe파일로 만든 경우에는 exe 파일 한개만 교체하면, 업데이트가 되지만,
DLL이 있는 경우, 어느것을 업데이트 해야할지, 아니면, 2개다 교체해줘야하는 번거로움이 있음.
- exe, DLL버젼이 서로 안맞는 경우, 문제가 됨
- DLL을 타인이 무작위로 사용할 수 있음.
- DLL파일을 만들기위한 프로젝트를 만들고, 관리해야 함.
- DLL이 분리되어 있어, DLL 내의 소스 수정이 필요한 경우, 절차가 번거로움.
exe 파일은 한번에 모두 됨.
- DLL이 수정된 경우, 해당 DLL을 사용하는 기존의 다름 프로그램도 영향을 받아, 문제가 될 수 있음.
- DLL버젼 표시가 어려움.
exe 파일에서 DLL파일의 버젼을 표시해주지 않는 이상, DLL파일의 날짜로만 구분이 가능해짐.
평가 : 단점이 더 많아 보임....
기타
----
DLL파일을 동적링크함으로써, 해당 응용프로그램을 자유롭게 확장할 수 있다.