본문 바로가기

프로그래밍/C++

[C++] 동적 라이브러리(DLL) 생성 & 명시적(explict) 연결하기

DLL(Dynamic Link Library) 이란

 

이름 그대로 동적으로 링크하는 라이브러리(Library : 표준화된 함수 및 데이터 타입을 모듈화한 프로그램 모음)를 말함

 

실행 파일에 결합되지 않으며 필요한 시점에 메모리로 읽어오고 불필요 시 메모리에서 내릴 수 있다.

 

연결 방식은 명시적 링킹(Explict Linking)암시적 링킹(Implicit Linking) 두가지가 있다.

 

암시적 연결(Implicit Linking)

 

암시적(묵시적) 연결은 실행 파일에 DLL 정보를 프로그램에 내장하는 방법이다

 

실행 파일에 정보를 포함하기 위해서 dll, lib, header 파일이 필요하고

 

프로그램을 시작하면서 해당 DLL을 로드한다.

 

명시적 연결(Explict Linking)

 

명시적 연결은 프로그램이 실행 중일 때 DLL이 있는지 검사하고 동적으로 원하는 함수만 불러와서 사용하는 방식이다

 

실행 파일에 정보를 포함하지 않기 때문에 dll 파일만 필요하고

 

원하는 함수만 불러오기 때문에 메모리를 절약할 수 있다.

 

 

두 방법을 비교해봤을 때 명시적 링킹보다 암시적 링킹이 비교적 쉽고 간단하지만

 

내가 명시적 연결을 선호하는 이유는 세가지

 

1. DLL이 필요한 시점에 불러오기 때문에 메모리가 절약된다

 

2. 실행중에 DLL 교체가 가능하다.

 

3. DLL파일만 있으면 된다. (제일맘에 듬)

 

그러므로 DLL을만들고 명시적으로 링크하는 방법을 적어보겠다

 

간단한 사칙연산을 함수로 만들어서 제공해보자 (sum, sub, mult, div)

 

 

1. DLL  프로젝트 생성하기

 

Visual Studio 실행 후 DLL 프로젝트를 생성

 

 

테스트용으로 DLLTest라는 이름으로 프로젝트를 만들고 Function.h, Function.cpp 를 추가하였다

 

 

헤더파일에 함수를 선언해준다

 

extern "C" 는 해당 함수가 C로 컴파일된 함수라는것을 컴파일러에게 알려주는 것이고 (C++는 컴파일 시 이름을 변경함)

 

__declspec(dllexport) 는 dll에서 데이터, 함수, 클래스 또는 클래스 멤버 함수를 내보낸다는 뜻 이다.

 

헤더에 선언한 함수를 cpp 파일에 정의해준다

 

 

2. DLL 생성

 

빌드를 하면 dll이 생성이 된다

 

Debug x64로 빌드를 하였으니 프로젝트 폴더 -> x64 -> Debug 폴더에 dll이 생성 될 것이다

 

 

 

3. 메인 프로젝트에서 DLL 로드하여 사용하기

 

메인 프로젝트 생성 후 소스코드가 있는 폴더에 이전에 만든 dll파일을 넣어준다

(exe 파일로 실행 시킬땐 exe 파일이 있는곳에 넣으면 됨)

 

 

메인 프로젝트 헤더에 함수 포인터 선언

 

명시적링크는 함수 포인터를 받아 호출하기 때문에 dll 프로젝트에 선언한 함수의 원형을 함수 포인터 형태로 선언한다

 

 

DLL 로드

 

LoadLibrary() 함수로 DLL을 로드하고 DLL 핸들에서 특정 함수의 함수 포인터를 가져온다

 

정상 로드가 안될경우 NULL이 반환된다

 

 

Load가 완료되면 아래와 같이 DLL 함수를 사용할 수 있다

 

DLL을 사용하지 않는다면 FreeLibrary로 해제한다.

 

 

실행 결과

 

'프로그래밍 > C++' 카테고리의 다른 글

[C++] ARM 기반 맥북 M1 VSCode, C++ 환경 세팅하기  (0) 2022.01.16