컴퓨터 시스템/Linker

Linker - Windows 에서 Static Linking, Dynamic Linking 실습 1

minseobi93 2021. 2. 13. 21:34

Windows 운영체제에서 *.lib는 정적 라이브러리, *.dll은 동적 라이브러리 파일이다. 

MSVC 2019로 실습을 해보자. 우선 라이브러리를 갖다가 쓸 콘솔 앱을 하나 생성한다. 

 

 

"MyApp.cpp"

#include <iostream>

int multiply_two(int n)
{
  return (2 * n);
}

int main()
{
  std::cout << multiply_two(100) << std::endl; // 200
}

위와 같이 int형 인자 한 개를 받아서 2를 곱해 반환하는 multiply_two() 함수를 구현해보기로 한다. 

 

<정적 라이브러리 생성>

 

"static_source.h"

int multiply_two(int n);

"static_source.cpp"

#include "static_source.h"

int multiply_two(int n)
{
  return (2 * n);
}

빌드 하면 아래와 같이 "StaticLib_Test.lib" 파일이 생성된다. 

다시 "MyApp.cpp"로 넘어가서, "StaticLib_Test.lib"를 정적 라이브러리로 링크하여 사용할 수 있게 하자. 

프로젝트 속성 : "모든 구성" 플랫폼 : "모든 플랫폼"을 선택 한다. 

 

1. 프로젝트 속성 > C/C++ > 일반 > 추가 포함 디렉터리 > 에 "static_source.h"의 디렉토리 경로 추가. 

2. 프로젝트 속성 > 링커 > 일반 > 추가 라이브러리 디렉터리 > 에 "StaticLib_Test.lib"의 디렉토리 경로 추가. 

3. 프로젝트 속성 > 링커 > 입력 > 추가 종속성 > StaticLib_Test.lib 추가

 

#include <iostream>
#include "static_source.h"

int main()
{
  std::cout << multiply_two(100) << std::endl; // 200
}

 

 

<동적 라이브러리 생성>

 

- 묵시적, 명시적 방법이 있다

- (묵시적인 방법이 명시적인 방법보다 사용하기 쉽지만, 빌드시에 .lib이 개입하며, 로드 타임에 강제로 연결되고 프로그램이 종료될때 까지 달고 있어야 하므로 dynamic linking의 원칙에 조금 맞지 않다고 생각한다).

- 다만, 이번 실습에서는 묵시적 방법을, 다음 실습에서는 명시적 방법을 사용해보자.  

- 4를 곱해주는 기능을 구현한다. 

 

"dynamic_source.h"

extern "C" __declspec(dllexport)int muliply_four(int n);

"dynamic_source.cpp"

#include "dynamic_source.h"

extern "C" __declspec(dllexport)int muliply_four(int n)
{
  return (4 * n);
}

빌드 하면, 아래와 같이 "DynamicLib_Test.lib", "DynamicLib_Test.dll"이 생성되었다. 

 

 

다시 "MyApp.cpp"로 넘어가서, 마찬가지로 "DynamicLib_Test.dll"를 동적 라이브러리로 링크하여 사용할 수 있게 하자. 

프로젝트 속성 : "모든 구성" 플랫폼 : "모든 플랫폼"을 선택 한다. 

 

1. 프로젝트 속성 > C/C++ > 일반 > 추가 포함 디렉터리 > 에 "dynamic_source.h"의 디렉토리 경로 추가. 

2. 프로젝트 속성 > 링커 > 일반 > 추가 라이브러리 디렉터리 > 에 "DynamicLib_Test.lib"의 디렉토리 경로 추가. 

3. 프로젝트 속성 > 링커 > 입력 > 추가 종속성 > DynamicLib_Test.lib 추가

4. MyApp.exe이 들어있는 폴더 안에 DynamicLib_Test.dll 가져다 놓기