[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);


© 2022.07. by Wookey_Kim

Powered by Hydejack v7.5.2