4. 라이브러리
라이브러리는 함수 또는 클래스 등 기능의 집합이다.
C에서 사용했던 stdlib 또한 c언어에서 사용하는 다양한 기능들의 집합인 라이브러리
이다.
직접 외부 라이브러리를 개발하게 되면 기능별로 프로젝트를 분리하여 개발할 수 있
다.
많은 기능들이 라이브러리로 제공한다.
(DirectX, OpenGL 등 그래픽스 라이브러리, FMOD와 같은 사운드, PhysX 같은 물리 엔진 등)
ALLPPT Layout Clean Text Slide for your Presentation
5. 정적 라이브러리 (Static Library)
정적 라이브러리(Static Library)는 프로그램을 작성하고 컴파일하여 링크 단계에서 라
이브러리(.lib 파일)를 실행 파일에 복사하여 포함시키는 것이다.
이때 실행 파일의 크기가 커지는 단점이 있지만 별도의 추가 작업 없이 라이브러리의
기능을 사용할 수 있는 점과 실행 파일에 포함되어 있기 때문에 라이브러리가 올바른
버전이라는 확신을 가질 수 있는 장점이 있다.
ALLPPT Layout Clean Text Slide for your Presentation
11. 정적 라이브러리 사용하기
이제 정적 라이브러리를 프로젝트에 포함시켜본다.
프로젝트 속성에 C/C++ - 일반에 추가 포함 디렉터리
정적 라이브러리의 헤더 파일이 있는 경로를 추가해준다.
라이브러리를 사용할 때에는 헤더 파일이 필요하다. (선언부)
.lib 파일만 있으면 어떤 기능이 들어있는지는 알 수 없다.
그래서 헤더 파일에서 기능을 호출할 때 lib을 사용한다.
그래서 추가 포함 디렉터리에 포함시키거나 헤더 파일만 옮겨
오는 방법 등을 사용하면된다.
12. 정적 라이브러리 사용하기
이제 .lib 파일을 포함시켜준다.
먼저 프로젝트에 .lib 경로를 포함하도록 하기 위해
링커 - 일반에서 추가 라이브러리 디렉터리에 .lib 파일이 있는
경로를 추가한다.
13. 정적 라이브러리 사용하기
.lib 파일을 프로젝트에 포함하는 방법을 3가지 정도 소개한다.
먼저 코드상에서 포함하는 방법이다.
#pragma comment(lib, “.lib파일명”)
위와 같이 작성하면 정적 라이브러리 파일을 빌드 중에
링커 단계에서 실행 파일에 포함시킬 것이다.
15. 정적 라이브러리 사용하기
마지막 방법으로는 프로젝트의 참조에 참조 추가를 하는 방법이다.
해당 방법을 이용하면 추가 포함 디렉터리, 추가 포함 라이브러리 등
추가하지 않고 라이브러리가 포함된다.
한 솔루션 내에서 작업한다면 가장 편한 방법이다.
16. 동적 라이브러리 (Dynamic Link Library)
동적 라이브러리(Dynamic Link Library)는 이름 그대로 프로그램 실행 파일에 연결
되지 않고 동적으로 프로그램이 실행될 때 연결하거나 런타임 중에 연결하여 사용할
수 있는 라이브러리이다.
정적 라이브러리와 달리 실행 파일에 포함되지 않기 때문에 실행 파일의 크기가 커지
지 않고 완전 별도의 기능의 묶음처럼 사용하여 다른 프로그램에도 사용할 수 있게 배
포도 할 수 있다.
단, 사용하는 방법은 정적 라이브러리보다 조금 복잡하다.
간단하게 DLL 예제를 만들면서 알아본다.
ALLPPT Layout Clean Text Slide for your Presentation
19. 동적 라이브러리 만들기
작성한 코드의 헤더 파일에 매크로를 작성 한 것을 볼 수 있다.
DLL에서 .dll과 .lib 파일을 만들 때에는 __declspec(dllexport)를
외부에서 사용할 함수 또는 클래스명 앞에 붙여야 하고
외부에서 사용할 때에는 __declspec(dllimport)를 붙여야 사용된다.
결론적으로 DLL 프로젝트 내부에서만 동작하는 기능이 있을 것이고
외부에서 사용할 기능이 있을 때 붙여주는데 옆의 코드와 같이 매크로로
작성하고 DLL 프로젝트에는 기본적으로 DLL_EXPORTS와 같은 매크로
를 #define 하도록 하여 사용한다.
21. 동적 라이브러리 만들기
DLL 프로젝트를 빌드하면 다음과 같이 파일들이 나온다.
정적 라이브러리와 다르게 .dll 파일이 추가로 나오는데
두 가지 방법으로 프로젝트에 포함할 수 있다.
22. 동적 라이브러리 사용하기
그 방법 중 첫 번째로 암시적 링킹이 있다.
암시적 링킹은 정적 라이브러리와 동일하게 .lib 파일을
#pragma comment, 프로젝트 속성, 참조 추가 등으로
프로젝트에 포함시킨다.
암시적 링킹(Implicit Linking)
23. 동적 라이브러리 사용하기
.dll 파일을 만들었는데 .lib 파일을 포함한다고 하니
이상하다고 생각될 것이다.
암시적 링킹(Implicit Linking)
24. 동적 라이브러리 사용하기
DLL 프로젝트에서 나온 .lib 파일은 Import Library 역할을 한다.
그리고 어떤 DLL을 사용할지에 대한 정보를 가지고 있다.
파일 용량을 봐도 알 수 있을 것이다.
이와 같이 암시적 링킹은 컴파일 링크 단계에서 정적 라이브러리처럼
DLL 파일의 .lib 파일을 실행파일에 포함한다.
하지만 용량이 그리 크지 않기 때문에 실행파일 크기도 그렇게 커지지 않
는다.
암시적 링킹(Implicit Linking)
25. 동적 라이브러리 사용하기
명시적 링킹은 프로그램이 실행중(Runtime)에 DLL을 링크하여
포함되어 있는 기능을 사용하는 방법이다.
명시적 링킹(Explicit Linking)
26. 동적 라이브러리 사용하기
Window 함수도 사용해야하고 조금 사용법은 복잡하다.
LoadLibrary를 통해 DLL을 로드한다.
GetProcAddress 함수 콜을 통해 Add라는 DLL의 함수를 가져온다.
그리고 콜하지만 하지만 현재 코드에서 바로 동작하지 않는다.
명시적 링킹(Explicit Linking)
27. 동적 라이브러리 사용하기
DLL 프로젝트에서 Add라는 함수를 만들고
프로그램 실행 중 윈도우 함수를 통해 가져와서
실행을 하였는데 왜 안되는 것인가?
DLL 파일 명도 맞고 함수 명도 맞다!
하지만 여기서는 C++의 특징때문에 함수명이 조금 특이해진다.
명시적 링킹(Explicit Linking)
28. 동적 라이브러리 사용하기
DLL Function Viewer라는 것을 이용하여 DLL 파일을 열어보면
내가 작성한 Add 함수의 이름이 이상한 것을 볼 수 있다.
이와 같이 함수명을 가지게 되는 이유는 C++이 객체 지향의 특징을 갖게
되고 그 중 다형성이라는 특징때문이다.
동일한 함수명으로 다른 기능을 구현하는 오버로딩에 의해 그 함수들을 구
분짓기 위해 함수명이 저렇게 변한다고 한다.
명시적 링킹(Explicit Linking)
29. 동적 라이브러리 사용하기
내가 작성한 함수명을 온전하게 가져오고 싶다면
Export 함수 앞이나 코드블럭을 하나 만들어서 extern “C”로 감싸준다.
그럼 C언어 규칙으로 링크를 하게되어 함수명이 내가 작성한대로 나온다.
기본적으로 cpp 코드는 extern “C++”이 암묵적으로 붙어있다고 한다.
이와 같이 수정 후 이전 코드에서 실행하면 잘 동작한다.
이렇게 런타임 중에 링크를 하는 것이 명시적 링킹이다.
명시적 링킹(Explicit Linking)
30. 공유 프로젝트 (Shared Project)
공유 프로젝트(Shared Project)는 이름 그대로 프로젝트의 소스 코드를 공유하는 프로
젝트이다. 말 그대로 공유 받아서 사용하기 때문에 내 프로젝트와 같이 빌드 된다.
그런데 개인 프로젝트나 회사내 프로젝트라면 사실 통째로 빌드하는게 더 편할 수 있
기 때문에 공유 프로젝트 사용도 괜찮다고 생각한다.
ALLPPT Layout Clean Text Slide for your Presentation
33. 공유 프로젝트 만들기
내 프로젝트에 포함 시키는 방법은 참조 추가에가서
공유 프로젝트 항목에 보면 새로 추가한 것이 있을 것이다.
체크를 해준다.
34. 공유 프로젝트 만들기
그리고 내 프로젝트에서 그냥 헤더파일 include 하고 구현한 기능을 사용
하면된다.
필요에 따라 기능의 집합을 라이브러리 형태가 아닌 오픈소스로 제공한다
면 이와 같이 공유 프로젝트를 사용하는 것도 좋을 것이다.
35. 비교
정적 라이브러리
.lib
버전 보장 가능
실행 파일이 .lib 만큼 커짐
빌드 속도 저하
디버깅이 힘들 수 있음
동적 라이브러리
.dll
버전 보장은 알 수 없음
실행 파일이 급격히 커지
지 않음
빌드 속도 영향 없음
디버깅이 힘들 수 있음
Shared Project
.vcxitems
버전 보장 가능
실행 파일 크기도 당연히
늘어남
빌드 속도도 그냥 가져다
쓰기에 .dll보다 느림
디버깅 용이
36. 파일 경로를 설정하는 방법
라이브러리에 포함되는 파일 경로를 설정하면서 ../ 등으로 사용하는 것을 보았을 것
이다.
이와 같이 파일 경로를 설정하는 방법 또한 다양하게 존재한다.
ALLPPT Layout Clean Text Slide for your Presentation
37. 절대 경로와 상대 경로
절대 경로는 말 그대로 모든 경로를 다 쓰는 것이다.
D:ProjectsConsoloWindowTestTest0SharedTest
위와 같이 공유 프로젝트의 경로를 다 쓰는 것이다.
이런 경우 내 PC에서는 잘 동작할 수 있으나 다른 PC에서는 경로가 달라져 문제가
생길 수 있다.
이때 상대 경로를 사용하면 쉽게 해결된다.
프로젝트 설정에서 라이브러리 경로를 설정하였었기에 기본적으로 현재 위치는 프
로젝트의 경로이다.
./ 로 현재 경로를 표현할 수 있다.
그리고 ../를 작성하면 현재 경로의 이전 폴더를 가리키게된다.
그래서 이전 라이브러리를 포함할 때 ../StaticLib 폴더를 설정하여 라이브러리 프로젝
트 폴더를 포함하였다.
ALLPPT Layout Clean Text Slide for your Presentation
38. Visual Studio에서 제공하는 매크로 경로
Visual Studio에서는 $(매크로명)으로 경로 정보를 제공하는 기능이 있다.
$(SolutionDir) - 현재 솔루션의 경로를 가져옴.
$(Configuration) - 현재 설정(Debug, Release 등) 이름을 가져옴.
$(Platform) - 현재 플랫폼(Win32, x64 등) 이름을 가져옴.
그래서 프로젝트 설정에서 빌드, 설정, 플랫폼 별로 폴더를 다르게 나오도록 하고싶
다면 프로젝트 설정에서 출력 디렉터리를
$(SolutionDir)$(Configuration)$(Platform)
위와 같이 작성해주는 방법을 사용할 수 있다.
ALLPPT Layout Clean Text Slide for your Presentation