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

    걍 사용하면 된다.