[DirectX] 라이브러리
in Study on WinAPI&DirectX
라이브러리에 대해서 알아보자.
라이브러리란?
클라이언트 프로그램이 자주 사용하는 함수들을 모아놓은 것이다.
게임 개발할 때 많이 쓰이는 유니티 엔진과 언리얼 엔진도 누구든 참조할 수 있는 외부 라이브러리에 속한다.
그리고 클라이언트 프로그램과 라이브러리를 연결하는 작업을 링크라고 한다.
링크는 아래 예시코드와 같이 작업할 수 있다.
math라는 헤더파일과 cpp파일을 StaticLib에 만들었을 때,
#include <StaticLib\math.h>
#pragma comment(lib, "StaticLib//StaticLib_d.lib")
라이브러리에는 정적 라이브러리와 동적 라이브러리가 있다.
정적 라이브러리(lib)
- lib파일을 실행 바이너리에 포함시킨다.
- 라이브러리를 수정할 시 다시 컴파일이 필요하다.
동적 라이브러리(dll)
- 필요한 부분만 메모리에 적재시킨다.
- 라이브러리를 수정할 시 수정한 dll만 배포시킨다.
동적 라이브러리 전처리 과정
dll의 헤더파일에서
#ifdef DYNAMICLIB_EXPORTS // 이 단어가 정의되어 있을 경우
#define DLL extern "C" __declspec(dllexport) // DLL을 이와 같이 정의한다.
#else
#define DLL extern "C" __declspec(dllimport) // 그렇지 않을땐 이와 같이 정의한다.
#endif
DLL int Mul(int a, int b);
DLL의 링크
원할 때마다 링크를 하고, 다 사용하면 해제할 수 있어서 파일의 크기와 메모리 적재량이 적다는 특징이 있다.
암시적 링크
// dll 암시적 링크
#include <DynamicLib\math_dll.h>
#pragma comment(lib, "DynamicLib//DynamicLib_d.lib")
명시적 링크
// 맨 위에 함수포인터를 이용한 함수 타입 정의
typedef int (*FUNC_TYPE)(int, int);
...
wchar_t path[256] = L"";
GetCurrentDirectory(256, path);
HMODULE hmodule = LoadLibrary(L"dll 파일이 있는 상대경로"); // 링크
FUNC_TYPE MulFunc = (FUNC_TYPE)GetProcAddress(hmodule, "Mul") // 해당 라이브러리의 Mul 함수를 호출함.
int c = MulFunc(100, 2); // c = 100 * 2 = 200;
// Mul 함수의 사용
if(hmodule != nullptr) // 링크의 해제
FreeLibrary(hmodule);