안녕하세요 오늘은 Visual Studio 2022에서 동적라이브러리(DLL)을 만들어 보겠습니다.
먼저 프로젝트를 만들어야겠죠? 프로젝트는 DLL(동적 연결 라이브러리)로 만들어 주시면 됩니다.
본인이 원하는 위치에 프로젝트를 만들고 프로젝트를 들어가 보면 예시로 작성된 소스파일과 헤더파일이 보이실 겁니다.
먼저 두개를 다 삭제해 주세요
두개를 삭제하신 뒤 소스파일에 cpp파일 하나, 헤더파일에 h파일하나를 생성해 줍니다.
저는 MyMath.cpp, MyMath.h 로 만들어 주었습니다.
그리고 먼저 MyMath.h에는
#pragma once
#ifdef CREATEDLL_EXPORTS
#define MYMATH_DECLSPEC __declspec(dllexport)
#else
#define MYMATH_DECLSPEC __declspec(dllimport)
#endif
extern "C" MYMATH_DECLSPEC double Sum(double a, double b);
extern "C" MYMATH_DECLSPEC double Sub(double a, double b);
extern "C" MYMATH_DECLSPEC double Mul(double a, double b);
extern "C" MYMATH_DECLSPEC double Div(double a, double b);
MyMath.cpp에는 다음과 같이 작성합니다.
#include "MyMath.h"
double Sum(double a, double b) {
return a + b;
}
double Sub(double a, double b) {
return a - b;
}
double Mul(double a, double b) {
return a * b;
}
double Div(double a, double b) {
return a / b;
}
여기서 헤더파일의 소스들을 살펴보자면
먼저 #ifdef CREATEDLL_EXPORTS는 CREATEDLL_EXPORTS라는 전처리기가 정의되었는지 확인하는 조건문 입니다.
전처리기가 정의되었는지 확인을 위해서는 프로젝트 설정 > C/C++ > 전처리기 > 전처리기 정의 에서 확인할 수 있습니다.
다음으로는 __declspec(dllexport) 와__declspec(dllimport)에 대해서 알아보겠습니다.
__declspec(dllexport) 키워드가 붙은 함수는 DLL 외부로 노출됩니다. 즉 해당 키워드가 붙은 함수를 호출할 수 있다는 의미입니다.
__declspec(dllimport) 키워드는 DLL에 정의된 함수를 호출하기 위해 사용됩니다. 즉 DLL에서 __declspec(dllexport)로 정의된 함수를 __declspec(dllimport)로 호출한다는 것 입니다.
그러고 나서 이제 실행을 하게 되면 동적라이브러리(DLL)을 만드는데 성공하였습니다.
* pch.h 오류 발생 시
컴파일 시 "미리 컴파일된 헤더를 찾는 동안 예기치 않은 파일의 끝이 나타났습니다. '#include "pch.h"을(를) 소스에 추가하시겠습니까?" 라는 오류가 발생하는 경우가 있습니다.
이 경우는 우리가 처음에 삭제해 주었던 pch.h파일이 미리 컴파일된 헤더를 사용하게 설정되어있습니다.
이는 프로젝트 속성 > C/C++ > 미리 컴파일된 헤더에서 미리 컴파일된 헤더의 사용을 미리컴파일된 헤더 사용 안함으로 변경해주시면 해결됩니다.
실행에 성공하였다면 이제 프로젝트 폴더로 들어가 봅시다.
프로젝트 폴더로 들어가게 되면 먼저 헤더파일이 보이고 x64 > Debug로 들어가면 .dll파일과 .lib파일이 있습니다.
이 세 개의 파일을 이용해서 동적라이브러리(DLL)을 이용할 수 있습니다.
저는 bin폴더에 .dll파일, include폴더에 MyMath.h파일, lib폴더에 .lib파일을 넣어 정리해 주었습니다.
#include <stdio.h>
#include <MyMath.h>
int main() {
int a = Sum(1, 2);
printf("%d", a);
return 0;
}
이제 새로운 빈 프로젝트를 만들고 해당 코드를 실행해 보면 실행이 안되는 것을 확인하실 수 있습니다.
이는 MyMath의 헤더파일, 라이브러리파일, 동적라이브러리파일의 위치를 지정해 주지 않아 정의가 되지 않았기 때문입니다.
이를 설정해주기위해 프로젝트 속성 > VC++ 디렉터리를 들어가보면
먼저 포함 디렉터리에 본인이 .h파일을 두었던 위치를 넣어줍니다.
그리고 라이브러리 디렉터리에 .lib파일의 위치를 넣어줍니다.
그리고 남은 .dll파일을 복사해서 현재 프로젝트의 폴더 안에 붙여넣기 해 줍니다.
그러면 실행을 위한 준비는 모두 끝났습니다.
그리고 나서 실행을 해보면...
짠 하고 저희가 정의해 줬던 함수를 사용할 수 있는 것을 확인할 수 있습니다.
참고 블로그: https://luckygg.tistory.com/278
'Study' 카테고리의 다른 글
리눅스 명령어 top, ps, jobs, kill (0) | 2024.05.23 |
---|