클래스를 DLL로 만들고 사용하기

 

클래스를 DLL로 만들고 사용하는 방법을 알아보겠습니다.


클래스 구조 코드 준비하기

 

헤더파일(.h파일)

#include <iostream>
using std::cout;
using std::endl;

#include <string>
using std::string;

class TestClass 
{
private:
	string stringTest;
	bool boolTest;
	int intTest;

public:
	TestClass();
	~TestClass();

	void SetString(string data);
	void SetBool(bool data);
	void SetInt(int data);

	string GetString();
	bool GetBool();
	int GetInt();
};

 

cpp파일

#include "ctest.h"

TestClass::TestClass() { cout << "Init TestClass!!" << endl; }
TestClass::~TestClass() { cout << "End TestClass!!" << endl; }

void TestClass::SetString(string data) { stringTest = data; }
void TestClass::SetBool(bool data) { boolTest = data; }
void TestClass::SetInt(int data) { intTest = data; }

string TestClass::GetString() {	return stringTest; }
bool TestClass::GetBool() { return boolTest; }
int TestClass::GetInt() { return intTest; }

 

위와 같이 DLL로 만들 클래스 구조의 코드를 준비합니다.


DLL Wrapper(래퍼) 선언부 만들기

 

헤더파일(.h파일)

#include "ctest.h"
#define DLL __declspec(dllexport)

extern "C" {
	DLL TestClass* CreateTestClass();

	DLL void SetString(TestClass* obj, string data);
	DLL void SetBool(TestClass* obj, bool data);
	DLL void SetInt(TestClass* obj, int data);

	DLL string GetString(TestClass* obj);
	DLL bool GetBool(TestClass* obj);
	DLL int GetInt(TestClass* obj);

	DLL void DeleteTestClass(TestClass* obj);
}

 

코드 설명

일반적인 DLL 만드는 방법과 동일하게 __declspec(dllexport) 명령어를 이용하여 DLL 라이브러리에서 호출가능한 함수로 만들어줍니다.

그리고 DLL에서 네임 맹글링된 함수를 가져오기 어렵기 때문에 extern "C" 명령어를 이용하여 네임 맹글링을 제거합니다.

이제부터 네임 맹글링을 하지않기 때문에 클래스를 사용하려면 클래스를 동적 할당하여 각 함수마다 동적 할당된 클래스의 주소를 알려주어야 합니다.

마지막으로 동적 할당하여 객체를 생성하였기 때문에 꼭 동적 할당 해제하는 함수도 만들어줘야 합니다.


DLL Wrapper(래퍼) 구현부 만들기

 

cpp파일

#include "ctestDLL.h"

TestClass* CreateTestClass() { return new TestClass(); }

void SetString(TestClass* obj, string data) { obj->SetString(data); }
void SetBool(TestClass* obj, bool data){ obj->SetBool(data); }
void SetInt(TestClass* obj, int data){ obj->SetInt(data); }

string GetString(TestClass* obj) { return obj->GetString(); }
bool GetBool(TestClass* obj){ return obj->GetBool(); }
int GetInt(TestClass* obj){ return obj->GetInt(); }

void DeleteTestClass(TestClass* obj) 
{
	if (obj) {
		delete obj;
		obj = nullptr;
	}
}

 

코드 설명

new를 이용하여 클래스를 동적할당하는 함수를 구현합니다.

각 함수에서는 동적할당한 클래스의 주소를 받고 동적할당한 클래스에서 함수를 다시 실행시켜야 합니다.

delete를 이용하여 꼭 동적할당해제를 해줘야합니다.


DLL 파일로 만들기

 

빌드 설정

 

빌드하기전에 [프로젝트 속성 > 구성 속성 > 일반] 에서 구성 형식을 동적 라이브러리(.dll)인지 꼭 확인해야합니다.

 

빌드 결과

빌드가 완료 되면 위와같이 dll파일과 lib파일이 생깁니다.

 

여기서 dll빌드를 하였는데 lib파일이 생기는건 암시적 링킹(Implicit linking)을 하였기 때문입니다. 좀 더 상세한 내용은 아래 포스팅을 통해 확인 할 수 있습니다.

 

https://rurustory.com/8

 

[C++] 정적 라이브러리(Static Link Library)와 동적 라이브러리(Dynamic Link Library)

정적 라이브러리(Static Link Library)와 동적 라이브러리(Dynamic Link Library) 개발을 할 때 자주쓰는 함수가 많아 중복을 최소화 하기위해 또는 협업을 효율적으로 하기위해 등등 각종 여러가지 이유로

rurustory.com


DLL 사용하기

 

이제 DLL을 만들었으니 새로운 프로젝트를 만들어 테스트를 해봅시다.

 

빌드 설정

 

1. [프로젝트 속성 > C/C++ > 일반] 에서 추가 포함 디렉터리에 dll의 헤더(.h 파일)가 있는 폴더경로를 설정해줍니다.

 

 

2. [프로젝트 속성 > 링커 > 일반] 에서 추가 라이브러리 디렉터리에 dll파일과 lib파일이 있는 폴더경로를 설정해줍니다.

 

 

3. [프로젝트 속성 > 링커 > 입력]에서 추가 종속성에 lib파일 이름을 입력해줍니다. 

 

Main cpp파일

#include "ctestDLL.h"

void main()
{
	TestClass* obj = CreateTestClass();

	SetString(obj, "Ruru TestString");
	SetBool(obj, true);
	SetInt(obj, 200);

	cout << "[GetString] " << GetString(obj) << endl;
	cout << "[GetBool] " << GetBool(obj) << endl;
	cout << "[GetInt] " << GetInt(obj) << endl;
    
	DeleteTestClass(obj);
}

 

빌드 결과

 

이제 빌드를 하면 정상적으로 빌드가 되는것을 확인할 수 있습니다.


마무리

 

지금까지 C++ 클래스를 DLL로 만들고 사용하는 방법이였습니다.

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

+ Recent posts