Search
Duplicate

LV03 정적 라이브러리

숙제

자신만의 프로젝트에서 정적 라이브러리를 구성하고 해당 라이브러리를 WinMain에서 사용가능하게 연결시켜 보세요.

라이브러리란?

라이브러리는 소프트웨어를 만들 때 쓰이는 클래스나 함수등 코드 덩어리를
가리키는 말이다.
라이브러리는 다른 프로그램들과 링크되기 위하여 존재하는, 하나 이상의 서브루틴이나 함수들의
집합이다.
링크(linking) 될수 있도록 보통 컴파일된 형태인 목적코드(object code)형태로 존재한다.
미리 컴파일 되어 있어서 컴파일 시간도 단축할수 있다.

[라이브러리 사용 목적]

라이브러리는 코드 재사용을 위해 조직화된 초장기 방법중 하나이며 많은 다른 프로그램들에서
사용 할수 있도록 운영체제나 소프트웨어 개발 환경 제공자들에 의해 제공되는 경우가 많다.
라이브러리 내에 있는 루틴들은 범용적으로도 사용이 가능하며
3차원 애니메이션 그래픽 등과 같이 특별한 용도의 함수로 설계 될수 있다.
라이브러리들은 사용자 프로그램과 링크되어 실행이 가능한 완전한 프로그램을 이룬다.

[라이브러리 종류]

동적 라이브러리 : 완성된 프로그램을 실행 할때 포함시키는 동적 라이브러리 ( .dll )
정적 라이브러리 : 프로그램 컴파일 하는 과정에서 포함시키는 오브젝트파일들의 모임 ( .lib )

정적라이브러리

프로그램 빌드 시에 라이브러리가 제공하는 코드를 실행파일에 넣는 방식(복붙)의
라이브러리 이다.
컴파일의 링킹 단계에서 실행파일이 결합된다.
특정 기능의 라이브러리를 static하게 제작한다는 것은 컴파일의 link단걔에서 라이브러리
(*.lib)파일을 실행 바이너리에 포함 시킨다는 이야기이댜.
즉 라이브러리의 동작 코드가 이를 사용하는 파일 속에 포함 되어 있기 떄문에
별도의 추가 작업 없이, 그리고 독립적으로 라이브러리 함수들을 사용 할 수 있다.
실행 파일에 포함되어 있기 때문에 실행 시 라이브러리가 없어도 된다.

[장점]

시스템 환경이 변해도 어플리케이션에 아무런 영향이 없고, 완성된 어플리케이션을
안정적으로 사용 할 수 있다.
컴파일시 필요한 라이브러리를 프로그램 내에 적재하기 떄문에 이식성이 좋다.
런타임시 외부를 참조할 필요가 없기 때문에 속도가 빠르다.

[단점]

같은 코드를 가진 프로그램이 실행할 경우가 있다면 코드가 중복될수 있으니
그만큼 메모리를 낭비하게 된다.
라이브러리 변경시, 변경된 라이브러리만 재배포하면 안되고 프로그램을 다시
재배포 해야한다.

동적 라이브러리

DLL 을 구현하고 컴파일을 하면 정적 라이브러리와는 다르게 2개의 파일이 생성된다.
하나는 .lib 파일, .dll 파일이다.
여기서 lib파일은 정적라이브러리의 lib파일과 전혀 다르다.
정적 라이브러리의 lib파일은 라이브러리 전체 코드를 포함하는 바이너리 파일이며,
Dll 의 lib파일은 dll 제공하고자 하는 함수 정보(함수 이름)을 가지는 정보 파일이다.
프로그램 시작할때 같이 로딩되며, 프로그램 종료 할때 메모리에서 해제되는 방법을 암시적 링킹
(Implicit linking) 이라고 한다.
프로그램 실행시 필요하면 dll파일에서 함수를 참조한다.
즉 lib 파일은 링크시 필요하고, dll파일은 실행시 필요하다.

[장점]

메모리를 절약하고 스와핑을 줄여준다.
dll이 한번 메모리에 올라가면 그것을 프로그램들이 공유하므로 메모리 사용 공간에 있어서 효율적이다.
Dll은 보다 쉽게 업그레이드 할수 있다.
서로 다른 프로그래밍 언어로 작성된 프로그램인 경우에도 함수 호출 규약을 잘 따르기만 하면
여러 프로그램에서 동일한 dll함수를 호출 할 수 있다.
프로그램 변경 시 변경된 부분의 공유 라이브러리만 재배포 하면 되므로 유지보수가 쉽다.

[단점]

외부 의존도가 높기 떄문에 이식성 떨어진다.
공유 라이브러리를 메모리 올리려면 찾고 올리는데 시간이 걸리므로 성능저하가 생긴다.

메세지 기반 프로그램의 단점

메시지 기반프로그램의 단점은 특정 메세지(이벤트)가 있을때만 특정코드가 동작된다는 점이다.
일반적인 응용프로그램에서는 상관이 없지만 게임은 플레이어가 멈춰 있어도 몬스터는 움직여줘야하는 상황이 많으므로
GetMessage함수를 통한 메세지기반으로 게임을 만들기에는 적합하지 않다.
winAPI에서는 SetTimer()함수를 통한 초단위 기반으로 메세지를 처리해줄수 있지만 이또한 너무 비효율적이다.
게임처럼 돌아가기 위해서 GetMessage가 아닌 매프레임마다 메세지를 확인할수 있는
PeekMessage를 사용할것이다. PeekMessage는 마지막 인자로 PM_REMOVE를 넣어줘야 메세지큐에서 메세지를 삭제해준다.