Windows_/Windows32_API

Windows :: 정적 라이브러리 만들기

sosal 2014. 7. 25. 23:20
반응형

/*

 * http://sosal.kr/

 * made by so_Sal

 */




1. 정적 라이브러리 만들기.
2. #pragma 명령어 사용하기

이번 포스팅은 그림과 Plus() 함수 기본 예제를 통해 설명해 나가도록 하겠습니다.

정적 라이브러리를 만들기

1.Win32 프로젝트를 생성합니다.

 


 

Win32 project는 윈도우를 포함하여 DLL, static library 등을 만들 수 있습니다.
이름을 입력하여 생성한 후 <마침>을 누르지 말고, 다음을 누른 다음,
응용 프로그램 종류 :: 정적 라이브러리
아참, 지금 만드려는 라이브러리는 간단하게 살짝 짚고 가는거니..
미리 컴파일된 헤더란에 체크를 풀고 마침 버튼을 ^-^;

 


 


그리고 하나의 헤더파일과 리소스 파일을 만들어 (소스, 리소스는 사실 차이가 없습니다.)
컴파일로 완성된 Static Library를 생성해봅시다.



생성된 lib와 헤더파일, 리소스파일




드디어 라이브러리가 완성되었습니다.


그럼 라이브러리는 언제 쓰며, 클라이언트가 어떻게 접근하는가? 에 대해서 보겠습니다.
우리는 이미 Static library를 생성하였기 때문에,
Plus.cpp 라는 리소스 파일은 더이상 필요하지 않습니다.
왜냐? 라이브러리에 그 모든 정보가 담겨있기 때문입니다.



위 그림과 같이 새로 만들 프로그램의 프로젝트를 생성하여,
위에서 만든 Plus.h 헤더파일과 Static_Lib.lib 정적 라이브러리 파일을
프로젝트 디렉토리에 넣은 후,
Plus 관련 라이브러리를 사용하는 프로젝트를 만들어 보겠습니다.



사용자가 만든 헤더파일은 " " 를 이용하여 추가하는것.
사용자가 헤더파일, 리소스파일에 함수를 추가하여 프로그램을 생성하여도 상관 없지만,
공유 라이브러리의 의미는 자주 사용하는 함수에 대해서는
사용자가 직접 헤더, 리소스에 추가할 필요 없이 가져와서 쓰겠다는 의미에서 만들어졌습니다.

일단 Plus.h 안에 함수들이 정의되어 있으니 #include " " 전처리 명령어로 헤더를 추가합니다.
하지만, 이것만으로는 Plus() 함수의 원형만 알 수 있을 뿐, 실제 리소스는 존재하지 않기 때문에
Plus() 함수를 바로 사용할 수 없습니다.
리소스 파일은 바로 아까 컴파일 하였던 정적 라이브러리 파일 Static_lib.lib 안에 들어있습니다.

#pragma는 프로젝트 빌드(Build)시에 라이브러리 파일을 포함하겠다고 선언하는 명령어입니다.
Plus.h 안에 정의되어있는 Plus() 함수의 리소스는 이 정적 라이브러리 파일 안에 구현되어있습니다.

컴파일해보면

 


 



Plus() 함수를 사용하는 program의 컴파일 흐름에 대해서 이야기 해보겠습니다.

사용자가 구현한 program 소스는 컴퓨터만이 아는 기계어로 변형됩니다.
이 사용자 프로그램 코드들은 기계어로 변형되어 .obj 오브젝트 라는 확장자로 새로 생성되는데,
이때 #include 전처리로 추가된 헤더파일이 함께 묶여집니다.
하지만 헤더파일에는 함수를 구현하고있는 리소스가 존재하지 않습니다.
따라서 오브젝트 파일은 #pragma 명령어로 함수가 구현되어있는 Static_lib.lib를 포함하여
program.exe 파일을 생성하게 됩니다.

program.exe는 obj와 lib 파일의 합성인 파일이지만, 컴파일 후에는 두 파일이 합쳐
하나의 프로그램을 생성하여 함수를 고치거나 추가하지 못하게 됩니다.
함수를 고치거나 추가하는것을 쉽게 하지 못하기 때문에 "정적" 라이브러리라는 표현을 합니다.

반대로 함수를 언제든지 추가, 수정할 수 있는 라이브러리를 동적 라이브러리라고 하는데,
이경우는 obj와 lib가 하나로 합치지 않고, obj혼자 exe 실행파일이 되어
함수가 필요할때마다 동적으로 lib에 접근하여 함수를 실행하기 때문에
이를 "동적" 라이브러리 라고 표현하게 됩니다.