DLL์ด๋ ๋ฌด์์ธ๊ฐ?
๋์ ๋งํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ :
๋์ ๋งํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์์ด: dynamic-link library, DLL)๋ ๋ง์ดํฌ๋ก์ํํธ ์๋์ฐ์์ ๊ตฌํ๋ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ๋ด๋ถ์๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ด ๋ถ๋ฌ์ ์ธ ์ ์๋ ๋ค์ํ ํจ์๋ค์ ๊ฐ์ง๊ณ ์๋๋ฐ, ํ์ฅDLL์ธ ๊ฒฝ์ฐ๋ ํด๋์ค๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ๋ ํ๋ค. DLL์ COM์ ๋ด๋ ๊ทธ๋ฆ์ ์ญํ ๋ ํ๋ค.
์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์๋๋ฐ,
๋ฌต์์ ๋งํน(Implicit linking) : ์คํ ํ์ผ ์์ฒด์ ์ด๋ค DLL์ ์ด๋ค ํจ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๋ ์ ๋ณด๋ฅผ ํฌํจ์ํค๊ณ ์ด์์ฒด์ ๊ฐ ํ๋ก๊ทธ๋จ ์คํ ์ ํด๋น ํจ์๋ค์ ์ด๊ธฐํํ ํ ๊ทธ๊ฒ์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ,
๋ช ์์ ๋งํน(Explicit linking) : ํ๋ก๊ทธ๋จ์ด ์คํ ์ค์ผ ๋ API๋ฅผ ์ด์ฉํ์ฌ DLL ํ์ผ์ด ์๋์ง ๊ฒ์ฌํ๊ณ ๋์ ์ผ๋ก ์ํ๋ ํจ์๋ง ๋ถ๋ฌ์์ ์ฐ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์ ์์ ๊ฒฝ์ฐ๋ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ํด์ฃผ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฉฐ, ํ์์ ๊ฒฝ์ฐ๋ ์ฌ์ฉํ๊ณ ์ ํ๋ DLL์ด๋ ํจ์๊ฐ ์คํ ํ๊ฒฝ์ ์์์ง ์์์ง ์ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค. (๋๋๋ก ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ ์ํด ์ฐ์ด๊ธฐ๋ ํ๋ค.)
์ถ์ฒ : https://ko.wikipedia.org/wiki/๋์ _๋งํฌ_๋ผ์ด๋ธ๋ฌ๋ฆฌ
์์ ์ ์๋ ๋ฌต์์ ๋งํน๊ณผ ๋ช ์์ ๋งํน์ ๊ดํ์ฌ ๊ฐ๊ฐ ๋ฐ๋ผํ๊ธฐ๋ฅผ ์ ์ํด๋ณด์๋ค.
๋จผ์ ๋ฌต์์ ๋งํน์ ๋ฐ๋ผํด๋ณด์.
๋ฌต์์ ๋งํน์ ์ฅ์ ์ ์๋์ ๊ฐ๋ค.
1. ์ฝ๋ค.
2. ํธํ๋ค.
๋ฐ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ ๋จ์ ์ด ์๋ค.,
1. ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น
2. ์๊ฐ ๋ญ๋น
์ฑ๋ฅ์ ํฌ๊ฒ ๊ณ ๋ คํ์ง ์๋๋ค๋ฉด ๋ฌต์์ ๋งํน์ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํ์ง๋ง, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ ๋ช ์์ ๋งํน์ด ํจ์จ์ ์ผ ์ ์๋ค.
์ฐ์ ๋ฐ๋ผํ๊ธฐ ์ฐจ์์์๋ "DLL ํธ์ถํ๋ค! ์ฌใ " ์ ๋์ ์ฑ์ทจ๊ฐ์ผ๋ก๋ ์ถฉ๋ถํ๋ค๊ณ ํ๋จํ๊ธฐ์ ๋ ์ด์์ ์์ธํ ์ค๋ช ์ ์๋ตํ๋ค.
๋ฌต์์ ๋งํน ๋ฐ๋ผํ๊ธฐ
ํ์๋ Visual Studio 2013์ ๊ธฐ์ค์ผ๋ก ์์ฑํ์๋ค. ๋๋ฌด ์ต์ ๊ฒ๋ ์๋๊ณ ๋๋ฌด ์๊ฒ๋ ์๋๋ฉด์ vc12๋ผ 11์ดํ
์ถ๊ฐ๋ ๋ค์ํ ๋ฌธ๋ฒ์ ์ํํ ์ ์๋ ๋๋ฆ ์ ๋นํ ๋ฒ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค.
1. VS2013 ์คํ
์์ ๊ฐ์ ํ๋ฉด์ด ๋ด๋ค. ์ ์ด์ ๋จผ์ DLLํ์ผ์ ๋ง๋ค์ด์ค ํ๋ก์ ํธ๋ฅผ ์์ฑํด๋ณด์. ์์ ํ์ด๋ผ์ดํธ๋ ์ ํ๋ก์ ํธ ํด๋ฆญ!
2. ์ ํ๋ก์ ํธ ์์ฑ : ํ๋ก์ ํธ ์ค์ ๋ฐ ํ๋ก์ ํธ๋ช ์ง์
์์ ๊ฐ์ด MakeDLLTutorial์ด๋ผ๊ณ ์ด๋ฆ์ง์๋ค. ํ์ธ์ ๋๋ฅด์.
3. ์ ํ๋ก์ ํธ ์์ฑ : ๋ง๋ฒ์ฌ-1
๊ทธ๋ฅ ๋ค์์ ํด๋ฆญํ์.
4. ์ ํ๋ก์ ํธ ์์ฑ : ๋ง๋ฒ์ฌ-2
์์ฉ ํ๋ก๊ทธ๋จ ์ข
๋ฅ์์ DLL์ ์ ํํ ๋ค ๋ง์นจ์ ํด๋ฆญ!
5. DLL์ ํตํด ํธ์ถ์ ํ ํจ์ ์ ์ ๋ฐ ๋น๋
์ ์ด์ DLL์ ๋ง๋ค ๊ธฐ๋ณธ ํ๋ก์ ํธ ํ ํ๋ฆฟ์ด ๊ตฌ์ฑ๋์๋ค. ์ด์ ์ธ๋ถ์์ ๋ถ๋ฌ๋ค์ฌ์ ์ฌ์ฉํ๊ณ ์ถ์ ํจ์๋ฅผ ์ ์ํด์ผ ํ๋ค.
๊ทธ๋ฅ ๋ฌด๋ํ๊ฒ ๋ํ๊ธฐ ๊ณฑํ๊ธฐํ๋ DLL์ ๋ง๋ค์ด๋ณด์.
์ฒซ ํ๋ฉด์ ์์ ๊ฐ์ ๊ฒ์ด๋ค. ์ธ๋ถ์์ ๋ถ๋ฌ๋ค์ผ dll ํจ์๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํจ์๋ฅผ ์ ์ํด์ผ ํ๋ค.
extern "C" __declspec(dllexport) int AddInt(int a, int b) { return a + b; }
์ด ๋ฐฉ์์ผ๋ก ์๋์ ๊ฐ์ด ํจ์๋ฅผ ์ ์ํ์.
extern "C" __declspec(dllexport) int AddInt(int a, int b) { return a + b; } extern "C" __declspec(dllexport) int MultInt(int a, int b) { return a * b; }
์ฒซ๋ฒ์งธ AddInt ํจ์๋ ๋๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์์ ๋ํด์ ๋ฆฌํดํด์ฃผ๋ ํจ์
๋๋ฒ์งธ MultInt ํจ์๋ ๋๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์์ ๊ณฑํด์ ๋ฆฌํดํด์ฃผ๋ ํจ์์ด๋ค.
Debug/Release ๊ตฌ์ฑ์ ์ ๊ฒฝ์ฐ์ง ์๊ฒ ๋ค. ์ฐ์ ๊ทธ๋ฅ Default๋๋ก Debug๋ก ๋น๋๋ฅผ ํด๋ณด์.
F7์ ๋๋ฅด๊ฑฐ๋ ๋น๋-์๋ฃจ์ ๋น๋๋ฅผ ํด๋ฆญํ์.
๋น๋๊ฐ ์๋ฃ๋์๋ค.
๋ง์ง๋ง์์ ๋๋ฒ์งธ ์ค์ ์๋ฏ์ด ์๋ฃจ์ ํด๋์ Output๊ฒฝ๋ก์ dll์ด ์์ฑ๋์๋ค๋ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ค์์ผ๋ก ๋์ด๊ฐ๋ณด์.
6. ์ ํ๋ก์ ํธ ์์ฑ : DLL ํธ์ถํ ํ๋ก์ ํธ ์์ฑ
ํ์ผ-์๋ก๋ง๋ค๊ธฐ-ํ๋ก์ ํธ๋ฅผ ๋๋ฌ ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํด๋ณด์.
์ด๋ฆ์ CallDLLTutorial์ด๋ผ๊ณ ์ง์๋ค. ํ์ธ์ ๋๋ฅด์. ์๊น์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ค์์ ๋๋ฅด๊ณ ,
์ด๋ฒ์ ์ฝ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ค.
7. DLL ํธ์ถํ๊ธฐ
DLL์ ์์์ ์ผ๋ก ํธ์ถํ๊ธฐ ์ํด์๋ ๋จผ์ ํธ์ถํ ํจ์๋ฅผ ์ ์ธํด๋์ด์ผ ํ๋ค.
ํค๋ ํฌํจ๋ถ ๋ค์ ์๋์ ๊ฐ์ด ์๊น ๋ง๋ ํจ์๋ฅผ ์ ์ธํ๋ค. ๋ฌธ๋ฒ์ ๋ฌป์ง๋ ๋ฐ์ง์ง๋๋ง๊ณ ์ฐ์ ๊ทธ๋๋ก ๋ฐ๋ผํด๋ณด์.
extern "C" __declspec(dllimport) int AddInt(int, int); extern "C" __declspec(dllimport) int MultInt(int, int);
๊ทธ๋ฆฌ๊ณ ์ต์ข ์ ์ผ๋ก๋ mainํจ์ ์์ ํด๋น ํจ์๋ฅผ ํธ์ถํด์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๊ตฌ๋ฌธ์ ์ถ๊ฐํ์.
int a = 5; int b = 10; printf("sum = %d \n", AddInt(a, b)); printf("mult = %d \n", MultInt(a, b));
์์ฑํ ์ต์ข ๋ชจ์ต์ ์์ ๊ฐ์ ๊ฒ์ด๋ค. ์ ์ด์ F7์ ๋๋ฌ ๋น๋๋ฅผ ์ํํด๋ณด์. ๋๋์ด DLL ํธ์ถ์ด ๋๋๊ฒ์ธ๊ฐ? ^^?
์ด๊ฒ ์ฌ๊ฑธ... ๋น๋๊ฐ ์คํจํ๋ค. ์ด๊ฑด ๋ฌด์จ๋ป์ธ๊ฐ???? ํจ์๋ ์ ์ธํ๊ณ ํธ์ถ๋ ํ๋๋ฐ ์????
์ปดํ์ผ๋ฌ : "์ด์ฉ๋ผ๊ณ , ํจ์๊ฐ ์ด๋ฆ๋ง ๊ฐ์ง๊ณ ๋ฌด์จ๋ป์ธ์ง ๋ด๊ฐ ์ด๋ป๊ฒ ์์?"
๊ทธ๋ ๋ค. ์ฐ๋ฆฌ๋ ํจ์์ ์ค์ฒด๋ฅผ ์ฐ๊ฒฐ์์ผ์ฃผ์ง ์์๋ ๊ฒ์ด๋ค. ์ฐ๊ฒฐ์์ผ์ฃผ๋ ๋ฐฉ๋ฒ์ ๋ค์ํ์ง๋ง, ์ฐ์ ์ ์ผ๋ก ํ๋ก์ ํธ ์ค์ ์ ๊ฑด๋๋ ค๋ณด์.
DLL์ ๋น๋ํ ๋ ๊ฐ์ ํด๋์๋ .lib๋ผ๋ ํ์ฅ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ด ์์ฑ๋๋ค. ์ด ๋์ ํตํด์ DLL์ ํตํด ๋ถ๋ฌ์ฌ ํจ์๋ฅผ ์ฐ๊ฒฐ์ํฌ ์ ์๋ค.
๊ณ ๋ก ์ฐ๋ฆฌ๋ libํ์ผ์ ๋จผ์ ์ฐ๊ฒฐ์์ผ์ฃผ๊ณ DLL ํ์ผ์ ํตํด ํจ์๋ฅผ ๋ถ๋ฅผ ๊ฒ์ด๋ค.
8. lib ํ์ผ ์ฐ๊ฒฐ
์ข์ธก ์๋ฃจ์ ํ์๊ธฐ ํ๋ก์ ํธ์ ๋ง์ฐ์ค ์ฐํด๋ฆญ์ ํ ๋ค ์์ฑ์ ํด๋ฆญํ๋ค.
์๋ก ๋ฌ ์ฐฝ์์ VC++๋๋ ํฐ๋ฆฌ - ์ผ๋ฐ - ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํฐ๋ฆฌ ์์ ํ์ดํ๋ฅผ ํด๋ฆญํ๊ณ ํธ์ง์ ํด๋ฆญํ๋ค.
์๊น MakeDLLTutorial์์ ์ถ๋ ฅํ ํด๋์ธ Debugํด๋๋ฅผ ํฌํจ์ํจ๋ค.
์ด ์์ ์ ์์ผ๋ก libํ์ผ์ ๋ถ๋ฌ๋ค์ผ๋ ๊ฒฝ๋ก ์ง์ ์์ด๋ ์์์ ์ ํฌํจ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฒ์ฌํ๋ค๋ ๋ป์ด ๋๊ฒ ๋ค.
ํ์ธ์ ๋๋ฌ์ ์ฐฝ์ ๋ซ๊ณ , ๋ค์์ ๊ตฌ์ฑ ์์ฑ - ๋ง์ปค - ์ ๋ ฅ - ์ถ๊ฐ ์ข ์์ฑ์ ์ฐ๋ฆฌ๊ฐ ์ถ๊ฐํ๊ณ ์ ํ๋ libํ์ผ์ ์ถ๊ฐํ๋ค.
์๊น ๋ง๋ค์ด ๋์๋ MakeDLLTutorial.lib ํ์ผ์ ์ถ๊ฐํ๋ค. ํ์ธ ๋ ํ์ธ์ ๋๋ฌ์ ์์ฑ ์ฐฝ์ ๋ซ์.
๋ค์ ํ๋ฒ ๋น๋์ ๋์ ! F7์ ๋๋ฅด์.
์ฐ์... ๋๋์ด ๋น๋์ ์ฑ๊ณตํ๋ค. ์ ๊ทธ๋ผ Ctrl+F5๋ฅผ ๋๋ฌ ํ๋ก๊ทธ๋จ์ ์คํํด๋ณผ๊น?^^
์์คํ
์ค๋ฅ๊ฐ ๋๋ฅ... ์ด๋์ ๋ง์ด ๋ณด๋ ํ๋ฉด๊ฐ๋ค...
๊ทธ๋ ๋ค. ์ฐ๋ฆฌ๋ lib์ ํตํด ์ด์ ํจ์๋ฅผ ์์๋จน์ ์ ์๊ฒ ์ฐ๊ฒฐ์์ผ์ฃผ์์ผ๋, ์ค์ ํจ์์ ์ค์ฒด์ธ dll์ exeํ์ผ ์ ์ฅ์์
๋๋ฌด์ง ์ด๋์๋์ง ์๋๋ฆฌ๊ฐ ์๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ์๊ฒํด์ค๊น?
๊ฐ์ฅ ์ฌ์ด๋ฐฉ๋ฒ์ ์คํํ์ผ๊ณผ ๊ฐ์ ๊ฒฝ๋ก์ dllํ์ผ์ ์ง์ด ๋ฃ๋ ๊ฒ์ด๋ค. ์คํํ์ผ์ด ์์ฑ๋ ๊ฒฝ๋ก์ ์๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋๋ฅผ
์ฐ๊ฒฐ์ํฌ ๋ ๋ฃ์๋ ๋๋ ํ ๋ฆฌ๋ก ๋ค์ด๊ฐ์ ๋ง๋ค์ด์ง dll ํ์ผ์ ๋ณต์ฌํ์ฌ exeํ์ผ๊ณผ ๊ฐ์ ๊ฒฝ๋ก์ ๋ฃ์ด๋ณด์.
ํ์์ ๊ฒฝ์ฐ ์์ ๊ฐ์ด ๋ณต์ฌํด๋์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ํ๋ฒ Visual Studio๋ก ๋์์์ Ctrl+F5๋ฅผ ๋๋ฅด์.
๋๋์ด ์ฑ๊ณตํ๋ค...
์ฐ์ ์ฌ๊ธฐ๊น์ง๋ก ๋ฌต์์ ๋งํน์ ํตํ DLL ๋ง๋ค๊ธฐ ๋ฐ ํธ์ถํ๊ธฐ๋ ์ฑ๊ณตํ์๋ค.
๋ง์ง๋ง์ผ๋ก ์ด ์๋ ๋ฌธ๋ฒ์ ๋ํ ์ค๋ช ์ ํด๋ณด๋๋ก ํ๊ฒ ๋ค.
extern "C" __declspec(dllexport) int AddInt(int a, int b) { return a + b; }
๋จผ์ extern "C"๋ ๋ฌด์์ธ๊ฐ?
์ปดํ์ผ๋ฌ๊ฐ ์์ค๋ฅผ ์ปดํ์ผํ๋ ๊ณผ์ ์์ ํจ์๋ช ์ ๋ค์ ๋งน๊ธ๋ง(Name Mangling)์ด๋ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ณํ๋๋๋ฐ, ์ปดํ์ผ๋ฌ๋ง๋ค ๊ท์น์ด ๋ฌ๋ผ ์ด๋ฆ์ ํตํด ํจ์ ํธ์ถ์ ํ๋๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. C++์ ๊ฒฝ์ฐ ๋ ๋ณต์กํ๊ฒ ๋ค์ ๋งน๊ธ๋ง์ด ๋ฐ์ํ๋ค. ์ฆ, extern "C"๋ 'C ํ์์ผ๋ก ํจ์ symbol์ ๋ง๋ค์ด ๋ฌ๋ผ'๋ ๋ป์ผ๋ก, ์ด๋ฅผ ์ด์ฉํ๋ฉด ๋ค์ ๋งน๊ธ๋ง์ด ๋ฐ์ํ์ง ์์ ๋ค๋ฅธ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ์์ด ํจ์ ํธ์ถ์ ํ ์ ์๋ค.
์ฐธ์กฐ : http://spikez.tistory.com/19
๋ค์์ผ๋ก __declspec(dllexport)๋ ๋ฌด์์ธ๊ฐ?
__declspec์ ํจ์์ ํน์ฑ์ ์ง์ ํ๋ ๊ตฌ๋ฌธ์ผ๋ก ์ค๋ช ํ๊ธฐ๊ฐ ๋ํดํ ์ ์ด ์์ด ์๋์ ๋งํฌ๋ฅผ ์ฐธ์กฐ๋ฐ๋๋ค. declspec์ด ์๋ง declare specification์ผ ๊ฒ ๊ฐ์ ๋๋ต์ ์ธ ๋ป์ ๊ฐ๋ ์ด ๊ฐ๋ค. ํน์ฑ์ ์ ์ธํ๋ค. ์ฆ, dllexport์ฉ ํจ์๋ผ๋ ํน์ฑ์ ์ ์ธํ๋ค๋ ๋ป์ด ๋๊ฒ ๋ค.
์ฐธ์กฐ : https://msdn.microsoft.com/ko-kr/library/dabb5z75.aspx
๊ทธ ๋ค์๋ ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ C/C++์์ ํจ์๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ผ๋ฏ๋ก ์ค๋ช ์ ์๋ตํ๊ฒ ๋ค.
๋ค์ ํฌ์คํ ์์๋ ๋ช ์์ ๋งํน์ผ๋ก ๋์์ค๊ฒ ๋ค.
๊ทธ๋ผ ์ด๋ง
'IT-Engineering > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
pragma comment lib : ๋ฌต์์ (์์์ ) ๋งํน (0) | 2017.02.22 |
---|---|
DLL ๋ง๋ค๊ธฐ ๋ฐ ํธ์ถํ๊ธฐ ๋ฐ๋ผํ๊ธฐ : 2. ๋ช ์์ ๋งํน (0) | 2017.02.03 |
๋๊ธ