0328 DLL API만들기
1, 2번은 DLL을 쓸 때 얘기고,
3, 4번은 정적 라이브러리를 쓸 때 얘기다.
라이브러리를 컴파일할때는
동적이면 전처리기에 MYLIB_BUILD_SHARED
정적이면 전처리기에 MYLIB_BUILD_STATIC
라이브러리를 사용할때는
동적이면 전처리기에 MYLIB_BUILD_NOT_SHARED
정적이면 전처리기에 MYLIB_BUILD_STATIC
/* mylib.h */
#if defined(MYLIB_BUILD_SHARED) // 이 라이브러리를 동적으로 컴파일할때
#define MYLIB_API __declspec(dllexport)
#elif defined(MYLIB_BUILD_NOT_SHARED) // 이 라이브러리를 동적으로 사용할때
#define MYLIB_API __declspec(dllimport)
#elif defined(MYLIB_BUILD_STATIC) // 이 라이브러리를 정적으로 컴파일 & 사용할때
#define MYLIB_API
#else
#error "you must specify library format!"
#endif
1. 만약 현재 코드(인터페이스)가 "DLL로 컴파일된다면"
무조건 "컴파일러 전처리기 옵션"에서
MYLIB_BUILD_SHARED 을 정의해주자. // 피동사 개념이다.
그리고 MYLIB_BUILD_SHARED 이 정의되어 있는 경우,
다음과 같은 전처리기가 작동한다.
#define MYLIB_API __declspec(dllexport)
입력 : 헤더, 소스, MYLIB_BUILD_DYNAMIC
출력 : my_lib.dll, 헤더, my_lib-d.lib
2. 만약 현재 코드(클라이언트)가 "DLL을 사용한다면"
전처리기 옵션에서
MYLIB_BUILD_NOT_SHARED을 정의해주자. // 이게 이름이 좀 그렇긴 한데 "사동사" 개념이다.
(이미 DLL은 컴파일되었겠지만, 헤더에게
DLL에서 불러오라고 알려야 한다. 헤더는 매크로가 없으면 알지 못한다.)
MYLIB_BUILD_NOT_SHARED이 정의된 경우
다음과 같은 전처리기가 작동한다.
#define MYLIB_API __declspec(dllimport)
입력 : my_lib.dll, 헤더, my_lib-d.lib, MYLIB_BUILD_STATIC
출력 : 응용프로그램(dll을 요구함)
3. 만약 현재 코드(인터페이스)가 "정적 라이브러리로 컴파일된다면"
다음과 같은 전처리기를 붙인다.
#define MYLIB_BUILD_STATIC
그리고 MYLIB_API는 다음과 같아진다.
#define MYLIB_API
그냥 아무것도 붙이지 말자.
입력 : 헤더, 소스
출력 : my_lib-s.lib
4. 만약 현재 코드(클라이언트)가 "정적 라이브러리를 사용한다면"
다음과 같은 전처리기를 붙인다.
#define MYLIB_BUILD_STATIC
걍 사용하면 된다.