클래스를 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)을 하였기 때문입니다. 좀 더 상세한 내용은 아래 포스팅을 통해 확인 할 수 있습니다.
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로 만들고 사용하는 방법이였습니다.
잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!
'프로그래밍 > C++' 카테고리의 다른 글
[C++] Crypto++ 라이브러리로 RSA 개인키, 공개키 생성하기 (0) | 2024.02.29 |
---|---|
[C++] Crypto++ 암호화 오픈 라이브러리 (0) | 2024.02.26 |
[C++] 정적 라이브러리(Static Link Library)와 동적 라이브러리(Dynamic Link Library) (0) | 2024.02.22 |
[C++] extern "C"와 네임 맹글링 (0) | 2024.02.21 |
[C++] 클래스 기본적인 사용법 (0) | 2024.02.21 |