[C++ DLL] Visual Studio C++ DLL ์์ฑํ๊ธฐ (์์ ํฌํจ)
์ง๋ ํฌ์คํ ์์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋์ /์ ์ ๋งํน์ ๋ํ ์ด๋ก ์ ์ธ ์๊ฐ๋ฅผ ํ์์ต๋๋ค.
[C++ DLL] ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ดํด
์ด๋ฒ ํฌ์คํ ์์๋ Visual Studio C++ DLL ํ๋ก์ ํธ๋ฅผ ํตํด dll์ ์ด๋ป๊ฒ ์์ฑํ๊ณ ๋ถ๋ฌ์ค๋์ง ์์๋ณด๊ฒ ์ต๋๋ค. ๋ณธ๋ฌธ์ ์์ ์์๋ ์ฌ์น ์ฐ์ฐ ํจ์๋ฅผ dll์ ๊ตฌํํ๊ฒ ์ต๋๋ค.
C++ DLL ํ๋ก์ ํธ ์์ฑ
Visual Studio ์คํ ํ Visual C++ > DLL(๋์ ์ฐ๊ฒฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ) ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
ํ๋ก์ ํธ ์์ฑ ํ MyMath.h
๋ฐ MyMath.cpp
ํ์ผ์ ์ถ๊ฐํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ 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;
}
์ฌ๊ธฐ์ ์ธ ๊ฐ์ง ์ค๋ช ๋๋ฆด ๋ด์ฉ์ด ์์ต๋๋ค.
์ ์ฒ๋ฆฌ๊ธฐ CREATEDLL_EXPORTS?
#ifdef
๋ CREATEDLL_EXPORTS
CREATEDLL_EXPORTS
๋ผ๋ ์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์ ์๋์ด์๋์ง ํ์ธํ๋ ์กฐ๊ฑด๋ฌธ์
๋๋ค. ๋ง์ฝ ์ ์๋์ด ์๋ค๋ฉด, MYMATH_DECLSPEC
์ __declspec(dllexport)
๋ฅผ ์๋ฏธํฉ๋๋ค. ์ ์๋์ด ์์ง ์๋ค๋ฉด, MYMATH_DECLSPEC
์ __declspec(dllimport)
๋ฅผ ์๋ฏธํฉ๋๋ค.
์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์ ์๋์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด์๋ ํ๋ก์ ํธ ์ค์ > C/C++ > ์ ์ฒ๋ฆฌ๊ธฐ > ์ ์ฒ๋ฆฌ๊ธฐ ์ ์์์ ํ์ธํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ์ฌ์ฉ์๊ฐ ์์๋ก CREATEDLL_EXPORTS
์ด๋ฆ์ ๋ณ๊ฒฝํ๊ณ , ์ ์ฒ๋ฆฌ๊ธฐ ์กฐ๊ฑด๋ฌธ์ ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํด๋ ์๊ด์์ต๋๋ค.
์ ์ด๋ ๊ฒ ๊ตฌ๋ถ ์ง์๋๋ฉด, ๋์ผํ *.h
ํ์ผ์ dll ์์ฑ ํ๋ก์ ํธ์ dll ํธ์ถ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๊ธฐ ์ํด์์
๋๋ค. ๋ง์ฝ, dll ์์ฑ ํ๋ก์ ํธ ์ ์ฉ *.h
ํ์ผ๊ณผ dll ํธ์ถ ํ๋ก์ ํธ ์ ์ฉ *.h
ํ์ผ์ ๋ฐ๋ก ๊ด๋ฆฌํ๋ค๋ฉด ๊ท์ฐฎ์์ง๊ฒ ์ฃ ? ๊ทธ๋์ ์ด๋ ๊ฒ ์ ์ฒ๋ฆฌ๊ธฐ ์ ์๋ฅผ ์ถ๊ฐํ์ฌ ํ๋์ ํ์ผ๋ก ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ง๋๋ค.
__declspec(dllexport)์ __declspec(dllimport) ํค์๋?
๊ทธ๋ผ __declspec(dllexport)
์ __declspec(dllimport)
๋ ๋ฌด์์ผ๊น์?
__declspec(dllexport)
ํค์๋๊ฐ ๋ถ์ ํจ์๋ DLL ์ธ๋ถ๋ก ๋
ธ์ถ๋ฉ๋๋ค. ์ฆ, DLL์ ์ฌ์ฉํ์ฌ __declspec(dllexport)
ํค์๋๊ฐ ๋ถ์ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค๋ ์๋ฏธ์
๋๋ค. ์ด์ ๋ฐ๋๋ก, ํด๋น ํค์๋๊ฐ ์๋ ํจ์๋ ์ ์๋์ด ์์ด๋ DLL ์ธ๋ถ์์ ํธ์ถํ ์ ์์ต๋๋ค.
__declspec(dllimport)
ํค์๋๋ DLL์ ์ ์๋ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ฆ, DLL์์ __declspec(dllexport)
๋ก ์ ์๋ ํจ์๋ฅผ __declspec(dllimport)
๋ก ํธ์ถํ๋ค๋ ๊ฒ์ด์ฃ .
extern "C" ํค์๋?
extern "C"
ํค์๋๋ฅผ ์ค๋ช
ํ๊ธฐ์ ์์, ๋ค์ ๋งน๊ธ๋ง(Name Mangling)
์ ๋ํด ์ค๋ช
ํ์ง ์์ ์ ์๋๋ฐ์. ๋ค์ ๋งน๊ธ๋ง์ด๋, ์ปดํ์ผ๋ฌ๊ฐ ํจ์์ ์ด๋ฆ์ ์ผ์ ํ ๊ท์น์ ๊ฐ์ง๊ณ ๋ณํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. C++์์๋ C์๋ ๋ค๋ฅด๊ฒ ํจ์ ์ค๋ฒ๋ก๋ฉ์ ์ง์ํ๋๋ฐ์. ์ฆ, ๋์ผํ ํจ์์ ์ด๋ฆ์ด๋ผ๋ ๋งค๊ฐ๋ณ์์ ๋ฐ๋ผ ๋ง์ปค๋ ๋ค๋ฅด๊ฒ ๊ตฌ๋ถํ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ ์ด๋ฆ์ ํจ์๊ฐ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ ๋ ์ด๋ค ํจ์๋ฅผ ํธ์ถํ ์ง ๊ตฌ๋ถํด์ ๋งํฌํ๊ธฐ ์ํด ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฆ์ ๋ณํํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ ๋งน๊ธ๋ง์ด ์ ์ฉ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ DLL์ ์ฌ์ฉํ์ฌ ๋ช
์์ ๋งํน(Explicit Linking)
์ ํ ๊ฒฝ์ฐ ํธ์ถํ ํจ์์ ์ด๋ฆ์ ์์์ผ ํ๋๋ฐ์. ํจ์์ ์ด๋ฆ์ด DLL๋ก ์์ฑ๋๋ฉด์ ๋งน๊ธ๋ง ๋๋ฉด ํธ์ถํ๊ธฐ๊ฐ ์ด๋ ต๊ฒ ์ฃ ? ๊ทธ๋์ extern "C"
ํค์๋๋ฅผ ๋ถ์ฌ ๋ค์ ๋งน๊ธ๋ง์ ์ํํ์ง ์๊ฒ ๋ค๊ณ ์ ์ํ๋ ๊ฒ์
๋๋ค.
DLL์ ํ์ํ ์ ์๋ Dependency Walker
ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ์ฌ, extern "C"
ํค์๋ ์ ๋ฌด์ ๋ฐ๋ฅธ ํจ์ ์ด๋ฆ์ ์ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
extern "C"
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ DLL์ ์์ฑํ๋ฉด, Sum, Sub, Mul, Div๋ผ๋ ํจ์ ์ด๋ฆ์ด ๋ณด์
๋๋ค(์ดํ ์์ ์์ ์์ฑํ ํจ์ ์ด๋ฆ์
๋๋ค). ๊ทธ๋ฆฌ๊ณ ์ ์ด์ C์ธ์ด๋ผ๊ณ ํ์๋ฉ๋๋ค.
extern "C"
ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ DLL์ ์์ฑํ๋ฉด, ํน์๋ฌธ์์ ๋๋ฌธ์ ์ํ๋ฒณ์ด ์์ธ ํจ์ ์ด๋ฆ์ด ๋ณด์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ด์ C++ ์ธ์ด๋ผ๊ณ ํ์๋ฉ๋๋ค.
์ด์ฒ๋ผ, extern "C"
ํค์๋๋ฅผ ํตํด ๋ค์ ๋งน๊ธ๋ง์ ์ํํ์ง ์์ ์ ์๊ณ , ๋ช
์์ ๋งํน์ผ๋ก ํน์ ํจ์ ํธ์ถ์ด ๊ฐ๋ฅํด์ง๋๋ค.
๋น๋ํ์ฌ DLL ์์ฑํ๊ธฐ
์ด์ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๊ฒ ์ต๋๋ค. ๋น๋ ํ *.dll
๋ฐ *.lib
ํ์ผ์ด ์์ฑ๋์์ต๋๋ค. ํฅํ ์ด ํ์ผ๊ณผ *.h
ํ์ผ์ ๊ฐ์ด ๋ฐฐํฌํ๋ฉด, ์ฌ์ฉ์๊ฐ ํ๋ก์ ํธ์ dll์ ๋ถ๋ฌ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ณธ๋ฌธ์ dll ์์ฑ ํ๋ก์ ํธ ์์ ์ฝ๋๋ฅผ ์ฒจ๋ถํ์ต๋๋ค. ์ถํ ์์ฑ๋ dll์ ์ด๋ป๊ฒ ํ๋ก์ ํธ์ ๋ถ๋ฌ์ ์ฌ์ฉํ๋์ง ์ด์ด์ ์๊ฐํ๊ฒ ์ต๋๋ค.
'Programming > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[C++ DLL] Visual Studio C++ ๋ช ์์ ๋งํฌํ๊ธฐ (์์ ํฌํจ)
[C++ DLL] Visual Studio C++ ๋ช ์์ ๋งํฌํ๊ธฐ (์์ ํฌํจ)
2020.12.10 -
[C++ DLL] Visual Studio C++ ์์์ ๋งํฌํ๊ธฐ (์์ ํฌํจ)
[C++ DLL] Visual Studio C++ ์์์ ๋งํฌํ๊ธฐ (์์ ํฌํจ)
2020.12.07 -
[C++ DLL] ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ดํด
[C++ DLL] ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ดํด
2020.11.28 -
[C++] ํ๋ฌ๊ทธ์ธ ๊ตฌ์กฐ๋ก ํ๋ก๊ทธ๋จ ํ์ฅํ๊ธฐ (์์ ํฌํจ)
[C++] ํ๋ฌ๊ทธ์ธ ๊ตฌ์กฐ๋ก ํ๋ก๊ทธ๋จ ํ์ฅํ๊ธฐ (์์ ํฌํจ)
2020.10.25