Library란?
c언어에서 library는 모듈화를 지원하는 개념이다.
기본적으로 C Programming은 소스 파일을 컴파일하고 그 결과물을 실행한다.
코드가 많아지면 소스파일을 여러 파일로 나누어 격리하고, 목적에 맞는 코드들을 모아 Library를 만든다.
Library는 각각 컴파일되며 링크 단계에서 execute file에 라이브러리(object code)가 연결된다.
특징
header와 구현부가 분리된다.
예시
게임엔진에서 sound를 처리하기 위해 FMOD를 사용함
Library Type
object code가 Linking되는 방법에 따라 나뉜다.
기능이 추가되면 library의 코드도 많아지고, 각 역할에 맞는 library도 많아져 실행 바이너리의 크기는 점점 증가한다.
한 번만 실행하면 괜찮을 수 있겠지만, 여러번 실행되면 많은 메모리 영역을 차지하고, 그러면 더 많은 메모리가 필요하다.따라서 메모리 관리 측면에서, 단일 실행에 적합한 Static Library와 다중 실행에 적합한 Dynamic (Linking) Library 로 library 형태를 구분지을 수 있다.
Library Type과 메모리 영역

concept
compile time에 library가 link된다.
장점
단점
사용
#include <*.h> #pragma comment(lib, "*.lib")
Concept
runtime에 library가 link된다
Output File
*.Lib: DLL의 "Implict Linking" 위한 링크 정보
- DLL이 제공하고자 하는 함수 정보(함수명)을 가지는 object file
- 프로그램 실행될 때 어떤 DLL을 쓰겠다는 정보 저장
*.DLL: 구현부(binary부)
- lib의 모든 코드 구현
- DLL은 OS에서 두 개 이상 실행되지 않음
- execute file 위치에 함께 존재해야 함
장점
단점
Implicit Linking
execute file 자체에 어떤 DLL의 어떤 함수를 사용하겠다는 정보를 포함시킨 링크 방식.
Explicit linking
프로그램이 실행 중일 때 API를 이용하여 DLL 파일이 있는지 검사하고 동적으로 원하는 함수만 불러와서 사용하는 링크 방식.
특징
예시: Unreal Engine
예시: 언어 설정 등의 분기 경우
Usage
<library header>
- export & import
#define DLL_EXPORT extern "C" __declspec(dllexport) #define DLL_IMPORT extern "C" __declspec(dllimport)
- 하나의 헤더로 묶어 처리
#ifdef DYNAMICLIB_EXPORTS #define MY_DLL extern "C" __declspec(dllexport) #else #define MY_DLL extern "C" __declspec(dllimport) #endif
<Source.cpp>
# include <*.h>
- Implict Linking
# pragma comment(lib, *.Lib)
- Explict Linking
// Load DLL HMODULE hDllHandle = LoadLibrary(L"LibName.dll"); if (!hDllHandle) return 0; // Call DLL Function // - Funtion Pointer typedef int(*FUNC_TYPE)(int); FUNC_TYPE pFunc = nullptr; pFunc = (FUNC_TYPE)GetProcAddress(hDllHandle, "FuncName"); if (pFunc) int data = pFunc(87);