Linker - Windows 에서 Static Linking, Dynamic Linking 실습 1
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 가져다 놓기