참조 : http://blog.naver.com/ultract2?Redirect=Log&logNo=110136714382
공통점은 둘 다 외부의 함수나 메소드의 코드를 가져다 쓰기 위함
가져다 쓰는 방식에서 차이가 남
lib는 해당 함수가 있는 lib파일에서 내가 짠 프로그램이 컴파일되고 링킹할 때
필요한 코드를 가져와 내 프로그램에 박아버린다.
그러나, dll은 박아버리지 않고, 어떤 파일에 접근해야되는지를 알아두고,
프로그램이 실행되어 해당 함수가 사용될 때 dll파일의 함수로 접근하는 방식이다.
lib는 필요한 코드를 내 프로그램의 코드에 넣어버리니, 당연히 프로그램 크기는 커진다.
하지만, 내가 가지고 있으니 다른 파일까지 가지 않아도 되니깐, 속도면에서 유리하다.
그리고 dll파일이 없어서 실행이 안되는 문제는 생기지 않는다.
하지만 dll방식은 프로그램 크기가 줄어드는 장점이 있다.
비유를 하자면 읽고 싶은 책이 있는데,
직접 그 책을 사서 내 책장에 꼽아놓고 보는 것과
도서관에 가서 책을 대여해서 보는 것의 차이
-------------------------------------------------------------------------------
* 정적 lib의 경우 컴파일 될 때 lib가 각 실행파일에 포함되어져서 실행 exe을 만들어 짐.
** 실행파일의 소스에서 정적 Lib을 추가하는 방법
#pragma comment (lib, "ExternalLib.lib")
extern void callFuncInLib(WCHAR * szMsgText);
int WINAPI WinMain ( ...)
{
callFuncInLib(L"Test") ;
return 0 ;
}
* 동적 dll의 경우 실행파일에 포함되지 않고 실행 파일과 함께 파일로 존재하다가 실행 파일이 실행되면 함께 로드된다. dll 파일을 생성하면 lib파일도 생성되는 데 이 파일은 실행파일을 만들 시 dll파일을 호출하는 최소 정보만 들어 있는 빈 껍데기 파일이며 실행파일 로드시 lib파일 정보에 따라 dll이 로드되는 것임.
* dll 파일
BOOL APIENTRY DllMain ( ..) { return TRUE ; }
__declspec(dllexport) void callFuncInDll(WCHAR * szMsgText) {...}
* call 파일
#pragma comment(lib,"ExamDLL.lib")
__declspec(dllimport) void callFuncInDll(WCHAR * szMsgText);
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE
hPrevInstance,
LPTSTR lpCmdLine,
int
nCmdShow)
{
callFuncInDll(L"TEST");
return 0;
}