본문 바로가기

C++

C++ Dll생성 및 사용

DLL프로젝트 만들기

DLL 프로젝트를 만들고 콘솔 프로젝트에서 DLL 프로젝트의 함수를 실행시키는 프로젝트


1. 콘솔 프로젝트 만들기

솔루션탐색기 -> 추가 -> 새 프로젝트 -> Win32 프로젝트

콘솔 응용프로그램을 만든다.


2.  빈프로젝트에 DLL 프로젝트 생성

솔루션탐색기 -> 추가 -> 새 프로젝트 -> Win32 프로젝트

해당 프로젝트는 콘솔 응용 프로그램이 아닌 DLL 항목을 선택 후 빈 프로젝트 옵션을 체크해 준다.
여기까지 했다면 2개의 프로젝트가 생성되었을 것이다.


3. DLL프로젝트에 TestClass생성

TestClass를 생성 후

1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma once
#include<iostream>
using namespace std;
 
class TestClass
{
public:
    TestClass();
    ~TestClass();
 
    void Print();
};
 
1
2
3
4
void TestClass::Print()
{
    cout << "AAA" << endl;
}

Print() 함수를 정의해주었다.


4. DLL프로젝트 빌드

해당 프로젝트를 빌드하게 되면 빌드 위치에 DLL 파일이 생성됨을 확인할 수 있다.
DLL 파일은 항상 클라이언트의 실행파일과 같은 위치에 존재하여야 한다.


5. DLL프로젝트의 h파일을 복사하여 새로운 폴더에 복붙 한다.

DLL용 헤더와 클라이언트용 헤더를 따로 분리하여야 한다 이유는 조금 있다가 설명하겠다.

프로젝트 파일 제일 처음에 Headers라는 폴더를 만들었고 해당 폴더에 DLL 프로젝트의 h 파일을 복붙 하였다.

 


6. 콘솔 프로젝트에 h파일 인식시키기

콘솔 프로젝트 우클릭 이후 속성 -> C/C++ -> 일반 -> 추가 포함 디렉터리

h 파일이 있는 위치를 콘솔 프로젝트한테 알려주어야 한다. 해당 경로는 상대 경로로 하였으나 절대 경로로 해도 문제는 없다. 다만 경로가 바뀌면 계속 변경해야 되는 번거로움이 존재한다.

해당 작업까지 완료 후 빌드를 실행하게 되면 에러가 발생할 것이다.

LNK2019라는 에러가 발생되는데 해당 에러는 링커 에러이다.
TestClass에 h 파일에서 Print라는 선언 부를 보고 해당 함수가 있는 것은 알고 있으나 Print에 정의부가 존재하지 않아 제대로 링커 할 수 없다는 이야기이다. 해당 에러를 고치기 위해서는 따로 정의부를 알려줘야 한다.


8. lib파일 만들기

dll 파일은 정의부는 있으나 선언 부는 들어있지 않는다. 하지만 링커 단계에서 해당 함수들의 선언 부를 알아야 함수들이 들어갈 수 있는 메모리가 할당이 된다. 그렇기 때문에 선언 부만 존재하는 lib 파일이 필요하다.
lib 파일은 dll 파일과 느 다르게 링커 단 게에서 묶이기 때문에 dll 파일의 문제를 해결해 줄 수 있다.

 

lib 파일은 dll 프로젝트의 h 파일 class 명 뒤에 _declspec(dllexport)을 붙여주어 만들 수 있다.
해당 함수는 MS에서 지원하는 함수이다. 해당 h 파일을 lib 파일로 내보내는 역할을 한다.
해당 함수를 추가 후 빌드하게 되면 원래는 없었던 lib 파일이 존재한다.
그리고 복사 붙여 넣기 해서 만든 h 파일에는 _declspec(dllimport) 해당 함수를 붙여준다.
해당 함수는 읽어 들이는 함수로 h 파일 읽어들이는 역할을 한다. 엔진에서는 내보내고 클락에서는 받을 수 있는 환경을 만들기 위해서 h 파일을 2개로 분리하였다.

 

lib 파일을 만들었으면 콘솔 프로젝트로 돌아와 해당 lib 파일을 알려주어야 한다.

콘솔 프로젝트 우클릭 이후 속성 -> 링커-> 입력 -> 추가 종속성

 

lib파일의 경로 알려주기

콘솔 프로젝트 우클릭 이후 속성 -> 링커-> 일반 -> 추가 라이브러리 디렉터리

이렇게 되면 h 파일을 내보내서 lib 파일을 만든 뒤 콘솔 프로젝트에 연결하는 게 끝났다.


빌드하게 되면 AAA가 정상 출력되는 것을 확인할 수 있다.

'C++' 카테고리의 다른 글

[C++] 고정수소점, 부동소수점  (0) 2021.12.14
C++ Static Library ,DLL(Dynamic Linking Library)  (0) 2021.01.23
C++ 콜백함수  (0) 2020.12.27
C++ STL(Map)  (0) 2020.10.06
C++ STL(알고리즘)  (0) 2020.09.28