메뉴 건너뛰기


Developer > Application

C,C++ 라이브러리 만들기

2013.12.30 12:07

푸우 조회 수:14644


라이브러리 만들기


이 HOWTO문서는 프로그래머들이 리눅스 상에서 어떻게 라이브러리를 만들고 사용하는지에 대한 방법을 논의한다. 이 문서는 정적 라이브러리, 공유 라이브러리, 동적 적재 라이브러리를 다룬다.


1. 소개

이 HOWTO문서는 프로그래머들이 리눅스 상에서 GNU 프로그램을 사용해서 어떻게 라이브러리를 만들고 사용하는지에 대한 방법을 논의한다. ‘프로그램 라이브러리’는 나중에 본 프로그램에 통합될 컴파일된 코드(자료)를 포함하고 있는 파일이다. 프로그램 라이브러리는 프로그램이 더 모듈화 되고, 컴파일하기 빠르게 하고, 업데이트하기 쉽게 만들어준다. 프로그램 라이브러리는 3가지 타입으로 나눌 수 있다. 정적 라이브러리(static library), 공유 라이브러리(shared library), 동적 적재(DL) 라이브러리(dynamically loaded library)


이 문서는 처음으로 프로그램이 실행되기 전에 실행 가능한 프로그램으로 설치되는 정적 라이브러리에 대해서 논의하겠다. 그리고 프로그램이 시작할 때 적재되고, 프로그램사이에 공유가 가능한 공유 라이브러리에 대해서 논의한다. 마지막으로, 프로그램이 실행될 때 언제든지 적재되고 사용될 수 있는 동적 적재 라이브러리에 대해서 논의한다. 동적 적재(DL) 라이브러리는 다른 방식의 라이브러리 형식(format)과 다르지 않다. (정적, 공유 라이브러리도 DL 라이브러리로 사용될 수 있다); 그 대신에, DL 라이브러리는 프로그래머에게 사용되는 방법에 의해 차이가 있다.


라이브러리를 개발하고 있는 개발자들은 공유 라이브러리로 만들어야 한다. 왜냐하면, 공유라이브러리는 그 라이브러리를 사용하고 있는 응용 프로그램으로부터 라이브러리를 개별적으로 업데이트 할 수 있기 때문이다. 동적 적재(DL) 라이브러리는 유용하다. 하지만, 사용하기 위해 더 많은 량의 작업을 필요하고 많은 프로그램들이 이 라이브러리가 제공하는 유연성을 필요로 하지 않는다. 반대로, 정적 라이브러리는 라이브러리를 업데이트 하는 것이 더 어렵기 때문에 일반적인 목적으로 사용되는 프로그램에는 추천하기 힘들다. 그래도, 각각은 그들의 장점을 가지고 있고, 각각의 타입에 대한 장점은 그 타입을 설명하는 섹션들에서 논의될 것이다.


공유 라이브러리를 DLL(Dynamic Linked Library)라고 하거나, DL라이브러리로 사용되는 라이브러리에 대해 DLL이라고 하거나, 위의 두 가지 상황에 맞는 라이브러리를 DLL이라고 하는 것은 의미 없는 일이다. 당신이 위의 것들 중 어느 의미를 고르더라고, 이 HOWTO 문서는 리눅스 상에서 돌아가는 DLLs를 다룰 것이다.


이 HOWTO 문서는 오늘날 대부분의 리눅스 배포판에서 사용되는 형식인 실행, 연결 형식(ELF : Executable and Linking Format)에 대해서 다룰 것이다. GNU gcc는 사실 ELF이외에 더 많은 라이브러리를 다룬다. 특별히, 대부분의 리눅스 배포판은 아직까지도 퇴색한 a.out형식을 사용한다. 그러나 그 형식은 이 문서의 범위를 벗어난다.


만약 당신이 프로그램을 많은 시스템에 포팅할 것이라면, 라이브러리를 설치하고 만들기 위해서 리눅스 툴을 직접 사용하기보다 GNU libtool을 사용하는 것을 고려하라. GNU libtool은 일관되고, 포팅 가능한 인터페이스 속에 공유라이브러리의 복잡성을 숨기는 역할(예를 들어, 라이브러리를 만들고 설치하는 것)을 지원하는 일반적인 라이브러리 지원 스크립트이다. 동적 적재 라이브러리를 위한 포팅 인터페이스를 사용하기위해, 당신은 많은 포팅 툴을 사용할 수 있다. GNU libtool은 ‘libltdl’이라는 툴을 포함한다. 그 외에도, 당신은 모듈의 동적 적재를 지원하는 glib라이브러리(glibc와 혼동하지마라)를 사용할 수 있다. glib에 대해서는 http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.html에서 더 많이 찾아 볼 수 있다. 다시 한 번 말하지만, 리눅스에서는 이런 기능은 이 HOWTO에 기술된 구성개념으로 구현 될 수 있다. 만약 당신이 리눅스에서 코드를 개발하거나 디버깅 하고 있다면, 당신은 이 HOWTO의 정보를 원하고 있을 것이다.