메모내용

Library

정적라이브러리와 동적라이브러리로 나뉜다. main 함수가 포함된 프로그램의 전반적 흐름 exe 와 exe 에서 필요로 하는 재료들을 함수단위로 구현해서 라이브러리 형태로 만들면 모듈라이브러리 로서 포함하여 프로그램을 빌드한다.

.lib ( Static Library )

Static 하게 Linking 되는 라이브러리. 빌드타임, 즉 컴파일 다음에 Link 를 하게 되는데, 그때 라이브러리 바이너리가 exe 에 함께 포함되는 경우. .lib 파일이 된다. ~ Frame work 를 사용하기 위한 API 함수들이 있는것이다. 어떤 함수를 불러라. 초기화 함수는 어떤 것이다. 프로그램 만들때 필요한 무언가 들을 잔뜩 모아놓은것 객체만 잔뜩 있을 수도 있고 함수만 잔뜩 있을수도 있다.

  • 정적 라이브러리는 실행 파일과 Link 시 결합되어 한 실행파일로 합성된다.

.dll ( Dynamic Linking Library )

  • 동적(Dynamic, runtime) 라이브러리는 실행 파일과 Link 시 합쳐지지 않고, 독립적인 실행파일 형태로 생성되며, 실행피알이 실행될때 '동적으로' 결합한다.
  • 라이브러리가 함수가 잇는데, 그게 exe 하고 결합하는 시점이 프로그램이 실행되는 시점인 경우
  • 독립적인 실행 형태를 가지는 파일
    • exe 나 dll 이나 둘다 porterble excutable 포맷을 가진 파일이 되는것이다
  • 정적라이브러리라면 exe 에 포함될 영역의 메모리를 덜쓰는 장점이 있다.
  • 라이브러리 포함시 버전관리 이슈가 생기는데,
    정적라이브러리로 만들게 되면 라이브러리 업데이트시 가져다 쓰는 쪽에서는 함수를 모두 고쳐야한다.
    하지만 동적 라이브러리로 만들게 되면 DLL 쪽에서 모든 함수를 Overwrite 하게 되므로, 자동으로 업데이트된 함수를 호출하게 된다.

정적 라이브러리 개발

제작자

                    
                        #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;
                        }
                    
                

동적 라이브러리 개발

참조 :: DLL

제작자

                    
                        #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
                
            

의존성 (dependency)

가져다 쓰면 쉽게 개발할 수있다. 의존관계가 존재하는 모든 dll 을 가져와야 한다. 하나의 dll 에서 보안결함 등 문제가 생기면, 그것을 가져다 쓰는 모든 프로젝트에서 문제가 생긴다. 전세계적으로 문제가 될 수도 있다. 거미줄보다 복잡하다. 관리를 잘해주어야 한다. 별도의 관리체계가 필요하다. 모든 의존관계를 파악하기는 힘들다. 나의 시야는 내가 가져다쓰는 dll 까지 정도로 제한이 되는것이 일반적

공동작업 이슈

library

Library 를 사용하는 프로젝트에서는 .lib 와 .h 이 필요합니다.

정적 라이브러리(.lib) 사용하기

출력할 라이브러리 의 프로젝트 설정

빌드시 해당 위치에 .lib 파일이 출력됩니다.

라이브러리를 참조할 프로젝트의 프로젝트 설정

Library 추가


#ifdef _DEBUG
#pragma comment(lib,"Debug/ServerCore.lib")
#else
#pragma comment(lib,"Release/ServerCore.lib")
#endif