c++에서 외부 라이브러리의 기능(메서드)를 사용해야하는 상황.
// [Project.cpp]
#include "Project.h"
#include "library.h"
void main(){
// library.cpp 에 정의되어있는 메서드
Function();
}
위와 같은 방식으로 Project.cpp 에서 library.cpp에 정의되어있는 Function() 메서드를 실행하려면 라이브러리를 어떻게 개발해야할까?
library 입장에선 export
library를 개발하는 입장에서는
// [library.h]
static bool __declspec(dllexport) Function(); //선언부
// [library.cpp]
#include "library.h"
bool Function(){
//정의부
}
위와 같이 내가 작성하는 Function을 __declspec(dllexport) 즉, export 하겠다고 선언해야한다.
proejct 입장에선 import
하지만 이게 끝이 아님
라이브러리 안에 정의된 함수를 외부 프로젝트에서 활용하고싶을 때는 외부 프로젝트 입장에서 라이브러리 함수를 import 해야하여, dllimport 개념이 사용된다.
아래 예시를 보자.
// [library.h]
#define DLL_API __declspec(dllimport)
static bool DLL_API Function();
이렇게 되면 library.h 기준에서 자기 자신에게 선언되어있는 메서드인 Function을 DLL_API라는 변수로 _declspec(dllimport) 즉, 외부 프로젝트 입장에서 라이브러리 내의 함수를 import 하여 사용할 것이라는 선언이 된다.
하지만 위처럼 작성 해놓으면 library.cpp내에서 개발할 때, 내가 작성하는 Function() 메서드가 외부 에서 사용될 것 (export) 임을 인식시킬 방법이 없다.
따라서 보통은 import, export 둘 다 쓰여야하므로 주로 이런 문법으로 사용함
// [library.h]
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
static bool DLL_API Function();
내부 소스에서 #define DLL_EXPORTS 를 작성하면 DLL_EXPORTS 가 정의되어있으므로, DLL_API 가 dllexport가 되고, 정의되지 않은 경우는 dllimport 가 된다.
최종적으로는 아래와 같은 형태로 작성된다.
// [library.h]
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
static bool DLL_API Function();
// [library.cpp]
#include "library.h"
#define DLL_EXPORTS
bool DLL_API Function(){
// 정의
}
// [Project.cpp]
#include "Project.h"
#include "library.h"
void main(){
Function();
}
외부 프로젝트에서 Function() 을 실행하면 __declspec(dllimport) 를 실행하게되고,
라이브러리 헤더에서, Function() 을 실행하면 __declspec(dllexport) 를 실행하게된다.