정적라이브러리와 동적라이브러리로 나뉜다. main 함수가 포함된 프로그램의 전반적 흐름 exe 와 exe 에서 필요로 하는 재료들을 함수단위로 구현해서 라이브러리 형태로 만들면 모듈라이브러리 로서 포함하여 프로그램을 빌드한다.
Static 하게 Linking 되는 라이브러리. 빌드타임, 즉 컴파일 다음에 Link 를 하게 되는데, 그때 라이브러리 바이너리가 exe 에 함께 포함되는 경우. .lib 파일이 된다. ~ Frame work 를 사용하기 위한 API 함수들이 있는것이다. 어떤 함수를 불러라. 초기화 함수는 어떤 것이다. 프로그램 만들때 필요한 무언가 들을 잔뜩 모아놓은것 객체만 잔뜩 있을 수도 있고 함수만 잔뜩 있을수도 있다.
#include <stdio.h>
int add_in_lib(int a, int b)
{
puts("add_in_dll v2.0");
return a+b;
}
#include <stdio.h>
// lib 경로를 적어주어야 한다. (link 단계에서 필요)
#pragma comment(lib,"./.lib 경로")
// 함수가 어떤게 있는지 알리기 (compile 단계에서 필요)
int add_in_lib(int, int)
int main()
{
add_in_dll(3,4);
return 0;
}
#include <stdio.h>
// OS 에게 함수존재 알리기
// dll 로 노출것입니다. 이 형태의 함수를
__declspec(dllexport) int add_in_dll(int,int)
int add_in_dll(int a, int b)
{
puts("add_in_dll v1.0");
return a+b;
}
#include <stdio.h>
// dll 이라고 해도 로딩코드는 lib 에 들어가 있기 때문에 이를 써주어야 한다.
#pragma comment(lib,"./.lib 경로")
// OS 에게 함수존재 알리기
// dll 로 가져올 것입니다. 이 형태의 함수를
__declspec(dllimport) int add_in_dll(int,int)
int main()
{
add_in_dll(3,4);
return 0;
}
/*
프로젝트설정.C/C++/.전처리기.전처리기 정의
에서 HEUKKELLDLL 을 정의하였다.
__declspec(dllexport) : 해당 키워드가 붙은 함수는 DLL 외부로 노출됩니다. 즉 외부에서 호출할 수 있습니다.
__declspec(dllimport) : 해당 키워드가 붙은 함수를 DLL 에서 찾습니다. DLL 을 사용하는 프로젝트에서, DLL 의 함수를 찾을때 사용합니다.
즉 HEUKKELLDLL 이 정의되었는지 여부에 따라서
해당 함수를 DLL 에 노출하는 것인지, DLL 에서 찾을것인지가 결정됩니다.
해당 라이브러리에서는 HEUKKELLDLL 을 정의하여 노출하는 쪽임을,
사용하는 쪽에서는 HEUKKELLDLL 이 정의되어있지 않아, DLL 에서 찾는것임을
정의하기 위해 사용하였습니다.
HeukKellLibrary_API 가 붙은 함수를 모아놓은 .h 를 include 시
Library 를 만드는 쪽에서는 해당 키워드를 붙여 함수를 노출함을 의미하고
Library 를 사용하는 쪽에서는 해당키워드를 DLL 에서 찾으라는 것임을 의미하게 됩니다.
즉 하나의 .h 파일로 DLL 사용과, 노출 관리가 가능하게 됩니다.
이렇게 하지 않으면,
노출하는 쪽에서는 일일이 __delcspec(dllexport) 를 따로 선언해주어야 합니다
사용하는 쪽에서는 일일이 __delcspec(dllimport) 를 따로 선언해주어야 합니다
*/
#ifdef HEUKKELLDLL
#define HeukKellLibrary_API __declspec(dllexport)
#else
#define HeukKellLibrary_API __declspec(dllimport)
#endif
가져다 쓰면 쉽게 개발할 수있다. 의존관계가 존재하는 모든 dll 을 가져와야 한다. 하나의 dll 에서 보안결함 등 문제가 생기면, 그것을 가져다 쓰는 모든 프로젝트에서 문제가 생긴다. 전세계적으로 문제가 될 수도 있다. 거미줄보다 복잡하다. 관리를 잘해주어야 한다. 별도의 관리체계가 필요하다. 모든 의존관계를 파악하기는 힘들다. 나의 시야는 내가 가져다쓰는 dll 까지 정도로 제한이 되는것이 일반적
Library 를 사용하는 프로젝트에서는 .lib 와 .h 이 필요합니다.
빌드시 해당 위치에 .lib 파일이 출력됩니다.
#ifdef _DEBUG
#pragma comment(lib,"Debug/ServerCore.lib")
#else
#pragma comment(lib,"Release/ServerCore.lib")
#endif