DirectX 11

220919

슬뷔 2022. 9. 19. 19:45

실제 실행되고 있는건 클라이언트이고, main 함수부터 출발한다.

 

클라이언트가 사용하는 라이브러리도 debug버전과 release버전으로 나뉘며,

debug 버전일 때는 debug 버전으로 만들어진 라이브러리를 사용해야한다.

 

라이브러리를 가져올 때는

#pragma comment(lib, "경로")

 

전처리기는 컴파일보다 먼저 처리가 된다.

 

정적라이브러리는 export 개념이 없다. 최종 결과물이 이미 안에 들어와버리기 때문

동적라이브러리는 실제 프로그램이 실행이 될 때 dll을 로드할 때 링크를 하는데

누구는 노출을 하고 누구는 감출 것인지 정해주어야 한다.

 

extern "c" __declspec(dllexport) => c 문법과 관련있기 때문에 c를 관용적으로 붙여준다.

dll 결과물은 lib, dll 두개가 나온다. 

이때 나오는 lib는 정적라이브러리랑 완전 다르다. 안에 코드가 들어있지 않다. 

정적라이브러리는 lib에 있지만 동적라이브러리는 코드가 dll에 들어있다.

빌드하는 입장에서는 export(노출시키겠다) 를 적어야한다.

동적에서 나오는 lib는 암시적인 링킹을 할 때 사용할 정보들이 들어있다.

가져다 쓰는 입장에서는 export 를 import로 바꿔서 사용해야한다.

 

dll 헤더에 가보면 대부분 아래처럼 구현을 해놓는다.

 

#ifdef DLL1_EXPORTS

#define MYDLL extern "c" __declspec(dllexport) -> 제공하는 입장에선 export

#else

#define MYDLL extern "c" __declspec(dllimport) -> 가져다 쓰는 입장에선 import로 바꾸게 한다.

#endif

 

MYDLL int Mul(int a, int b);

 

동적라이브러리에서 나오는 .lib는 어떤 dll 을 참조해야하고 그 dll에는 어떤게 들어있는지 설명해주는 것이 들어있다.

이 안에는 어떤 정보를 링크해야할지에 대한게 들어있고 코드가 들어있진 않다.

정적라이브러리처럼 exe 파일 내에 코드가 들어있는 것이 아니기 때문에 진짜 dll 파일은 그래서 실행파일이랑 같이 있어야 한다.

그래야 exe를 눌렀을 때 lib에 어떤 dll을 링크할것인지 찾아서 링크할 수 있기 때문이다.

 

dll을 쓰는 의도 (장점)

1. 공유해서 사용

같은 dll을 사용한느 프로그램을 여러개 실행할 때 하나의 dll만 사용해서 필요한 메모리만 사용하게끔 한다.

 

2. 프로그램 실행파일안에 같이 들어있는게 아니고 링크를 거는 방식이어서 프로그램이 종료되지 않아도 중간에 링크를 끊을 수 있다. (정적라이브러리면 할 수 없다) -> 이러려면 암시적인 링크를 사용하면 안된다.

 

암시적 링크는 lib를 링크거는것이다. 

 

// 암시적 링킹 -> dll 파일안에 무슨 파일이 있고 어떤 함수가 있는지 알기 때문에 알아서 주소 찾아서 링킹이 된다.

#ifdef _DEBUG

#pragma comment(lib, ".lib")

#else

#pragma comment(lib, ".lib")

#endif

 

명시적으로 하려면 lib 파일이 필요없고 dll만 필요하다. 

// dll 명시적링킹

HMODULE hLib = LoadLibrary("dll 경로");

 

exe 파일을 실행하자마자 링킹이 되는 것이 아니라, 실행되고 main 함수가 돌아서 라이브러리가 링킹되어 실행된다.

 

if (nullptr == hLib)

return 0;


typedef int (*MUL)(int, int); // 반환타입 int 인자로 int int 받는것

MUL pFunc = (MUL)GetProcAddress(hLib, "Mul"); // 라이브러리 내에서 Mul 이라는 함수의 주소를 찾는다.

int c = pFunc(5, 5);

 

FreeLibrary(hLib); -> 명시적링킹을 할 때 라이브러리를 끊으려면 꼭 해주어야 한다.

 

 

dll은 대부분 암시적으로 사용한다.

'DirectX 11' 카테고리의 다른 글

220929  (0) 2022.09.29
220922  (0) 2022.09.26
220921  (0) 2022.09.26
220920  (0) 2022.09.22
220915  (0) 2022.09.15