Library4developers: 두 판 사이의 차이

Ubuntu Korea Community Wiki
둘러보기로 이동 검색으로 이동
imported>Wiki
imported>Drake
26번째 줄: 26번째 줄:
* sudo apt-get install로 설치가 가능하다.
* sudo apt-get install로 설치가 가능하다.
ex)
ex)
<pre lang="bash">
<syntaxhighlight lang="bash">
sudo apt-get install libxml2-dev
sudo apt-get install libxml2-dev
</pre>
</syntaxhighlight>
* 설치된 라이브러리는 일반적으로 /usr/include에 헤더파일이 들어가며, /usr/lib에 .so파일과 .a파일이 들어간다.
* 설치된 라이브러리는 일반적으로 /usr/include에 헤더파일이 들어가며, /usr/lib에 .so파일과 .a파일이 들어간다.
== 라이브러리 사용법 ==
=== Chapter 1 ===
* 두개의 함수가 포함되어 있는 작은 라이브러리를 만들어보자. 예제에서는 이들 중 하나를 사용할 것이다. 이 함수들은 fred와 bill이며, 간단한 인사말을 출력한다. 우리는 각자 따로 소스파일을 작성할 것이다.
<source lang="c" title="fred.c">
#include <stdio.h>
void fred(int arg)
{
  printf("fred: you passed %d\n", arg);
}
</source>
<source lang="c" title="bill.c">
#include <stdio.h>
void bill(char *arg)
{
  printf("bill: you passed %s\n", arg);
}
</source>
* 이러한 함수들을 각자 컴파일한 후 오프젝트파일을 만듦으로서 라이브러리파일에 포함시킬 수 있다. 우리는 -c 옵션을 사용함으로서 gcc가 실행가능한 완벽한 프로그램을 만들지 못하도록 해야 한다(.o 파일을 뽑아야 한다). 만일 이 소스를 -c옵션을 사용하지 않고 컴파일하면 main이 정의되지 않았다고 <s>지랄</s>실패할 것이다.
<source lang="bash">
$ cc -c bill.c fred.c
$ ls *.o
bill.o    fred.o
</source>
</source>
=== Chapter 2 ===
* bill 함수를 호출하는 프로그램을 작성해보자. 먼저, 라이브러리에 필요한 헤더파일을 만들자. 이 헤더파일은 라이브러리 내부에서 함수들을 선언하는 것이며, 본 라이브러리를 사용하는 프로그램은 모두 이 헤더파일을 포함해야 한다.
<source lang="c" title="lib.h">
/* 이건 lib.h다. fred와 bill을 사용할 어플들은 모두 이걸 include하도록 */
void bill(char *);
void fred(int);
=== Chapter 3 ===
* 본 라이브러리를 사용하는 프로그램(program.c)을 작성하는 일은 존나 쉽다. 필요한 라이브러리와 헤더파일을 포함하고, 라이브러리에 들어있는 함수만 호출하면 된다.
<source lang="c" title="program.c">
#include "lib.h"
int main()
{
  bill("헬로 월드");
  return 0;
}
</source>
* 이제 프로그램을 컴파일하고 테스트해보자. gcc한테 소스코드를 모두 오브젝트 파일로 컴파일하고 실행파일로 링크하라고 하자.
<source lang="bash">
$ cc -c program.c
$ cc -o program program.o bill.o
$ program
bill : you passed 헬로 월드
$
</source>
=== Chapter 4 ===
* 이제 라이브러리를 만들고 사용해보자. ar프로그램을 사용하여 archive을 만들고 여기에 오프젝트 파일을 추가한다. 이 프로그램이 ar이라 불리는 까닭은 archive를 만들거나 각각의 파일을 모아서 하나의 커다란 파일에다 모아주기 때문이다.<s>아카이빙이라고 하면 있어보이긴 하는데 못알아듣잖아</s> ar은 텍스트 파일들의 archive를 만들때에도 사용할 수 있기 때문에 주목해야 한다.<s>리눅스는 뭐하나 알면 두고두고 우려먹을 수 있으니까 좋잖아</s>
<source lang="bash">
$ ar crv lib.a bill.o fred.o
c - bill.o
c - fred.o
$
</source>
* 이제 라이브러리를 만들었고, 두개의 오브젝트파일을 추가했다. 버클리 유닉스에서 파생된 몇몇 시스템에서는 라이브러리를 성공적으로 사용하기 위해 라이브러리 목록이 필요하다. 이 일은 ranlib라는 명령으로 처리한다. 하지만 리눅스와 같은 시스템에서 GNU 개발툴(build-essential)을 사용하면 이 과정은 필요없다.<s>BSD에선 필요하다. 짜증</s>
<source lang="bash">
$ ranlib lib.a
</source>
* 이제 라이브러리를 사용할 준비는 끝났다. 보통 프로그램을 만들 때 이러한 라이브러리를 추가할 수 있다.
<source lang="bash">
$ cc -o program program.o lib.a
$program
bill : you passed 헬로 월드
$
</source>
* 오브젝트 파일이나, 라이브러리 또는 실행 가능한 프로그램에 어떤 함수가 포함돼있는지 알아보기 위해 nm이라는 명령어를 사용할 수 있다. program과 lib.a를 살펴보면, 라이브러리는 fred와 bill을 포함하고 있지만 program은 단지 bill만 포함하고 있다는걸 알 수 있다. 프로그램이 만들어질 때, 실제로 필요한 함수들만 라이브러리에 포함된다. 라이브러리의 모든 함수들이 선언된 헤더 파일을 포함한다고 해서 모든 라이브러리 함수들이 포함되는건 아니다.
* 만약에 여러분이 [[MSDOS]]나 [[윈도우]] 소프트웨어 개발에 대해 좀 알고 있다면 몇가지 유사한 점을 살펴볼 수 있다.
{| cellpadding="0" cellspacing="0" border="1" width="100%"
|-
| Item
| Unix
| DOS / Windows
|-
| 오브젝트 모듈
| lib.a
| lib.lib
|-
| 실행파일
| program
| program.exe
|}

2014년 6월 9일 (월) 10:44 판

라이브러리란?

  • 도서관이라는 뜻처럼, 헤더 파일과 실행 루틴이 모여 있는 것으로 프로그래밍 언어에서 입출력과 문자열 관리와 같은 일상적인 작업을 추가할 때 사용한다.

동적 라이브러리와 정적 라이브러리의 특징

동적 라이브러리

  • 일반적으로 .so 로 끝나는 이름을 하고 있다.
  • 윈도우의 DLL 파일이라고 생각하면 된다.
  • 실행할 때 시스템에 설치되어 있는 라이브러리를 가져다 사용하므로, 정적 라이브러리에 비해 상대적으로 느리다.
  • 공유 라이브러리를 사용하면 실행파일에 라이브러리를 포함할 필요가 없으므로 스토리지가 절약된다.
  • 컴파일러의 기본값이다.
  • 사용법
gcc --shared -o parse parse.c -lxml2

정적 라이브러리

  • 일반적으로 .a 로 끝나는 이름을 하고 있다.
  • 윈도우의 lib 파일이라고 생각하면 된다.
  • 컴파일할 때 함수를 실행파일에 포함한다.
  • 실행할 때 모든 함수가 실행파일 안에 있으므로, 동적 라이브러리에 비해 상대적으로 빠르다.
  • 정적 라이브러리를 사용하면 의존성 등에서 조금 더 자유로울 수 있다.
  • 사용법
gcc --static -o parse parse.c -lxml2

라이브러리의 설치

  • sudo apt-get install로 설치가 가능하다.

ex) <syntaxhighlight lang="bash"> sudo apt-get install libxml2-dev </syntaxhighlight>

  • 설치된 라이브러리는 일반적으로 /usr/include에 헤더파일이 들어가며, /usr/lib에 .so파일과 .a파일이 들어간다.

라이브러리 사용법

Chapter 1

  • 두개의 함수가 포함되어 있는 작은 라이브러리를 만들어보자. 예제에서는 이들 중 하나를 사용할 것이다. 이 함수들은 fred와 bill이며, 간단한 인사말을 출력한다. 우리는 각자 따로 소스파일을 작성할 것이다.

<source lang="c" title="fred.c">

  1. include <stdio.h>

void fred(int arg) {

 printf("fred: you passed %d\n", arg);

} </source> <source lang="c" title="bill.c">

  1. include <stdio.h>

void bill(char *arg) {

 printf("bill: you passed %s\n", arg);

} </source>

  • 이러한 함수들을 각자 컴파일한 후 오프젝트파일을 만듦으로서 라이브러리파일에 포함시킬 수 있다. 우리는 -c 옵션을 사용함으로서 gcc가 실행가능한 완벽한 프로그램을 만들지 못하도록 해야 한다(.o 파일을 뽑아야 한다). 만일 이 소스를 -c옵션을 사용하지 않고 컴파일하면 main이 정의되지 않았다고 지랄실패할 것이다.

<source lang="bash"> $ cc -c bill.c fred.c $ ls *.o bill.o fred.o </source> </source>

Chapter 2

  • bill 함수를 호출하는 프로그램을 작성해보자. 먼저, 라이브러리에 필요한 헤더파일을 만들자. 이 헤더파일은 라이브러리 내부에서 함수들을 선언하는 것이며, 본 라이브러리를 사용하는 프로그램은 모두 이 헤더파일을 포함해야 한다.

<source lang="c" title="lib.h"> /* 이건 lib.h다. fred와 bill을 사용할 어플들은 모두 이걸 include하도록 */ void bill(char *); void fred(int);

Chapter 3

  • 본 라이브러리를 사용하는 프로그램(program.c)을 작성하는 일은 존나 쉽다. 필요한 라이브러리와 헤더파일을 포함하고, 라이브러리에 들어있는 함수만 호출하면 된다.

<source lang="c" title="program.c">

  1. include "lib.h"

int main() {

 bill("헬로 월드");
 return 0;

} </source>

  • 이제 프로그램을 컴파일하고 테스트해보자. gcc한테 소스코드를 모두 오브젝트 파일로 컴파일하고 실행파일로 링크하라고 하자.

<source lang="bash"> $ cc -c program.c $ cc -o program program.o bill.o $ program bill : you passed 헬로 월드 $ </source>

Chapter 4

  • 이제 라이브러리를 만들고 사용해보자. ar프로그램을 사용하여 archive을 만들고 여기에 오프젝트 파일을 추가한다. 이 프로그램이 ar이라 불리는 까닭은 archive를 만들거나 각각의 파일을 모아서 하나의 커다란 파일에다 모아주기 때문이다.아카이빙이라고 하면 있어보이긴 하는데 못알아듣잖아 ar은 텍스트 파일들의 archive를 만들때에도 사용할 수 있기 때문에 주목해야 한다.리눅스는 뭐하나 알면 두고두고 우려먹을 수 있으니까 좋잖아

<source lang="bash"> $ ar crv lib.a bill.o fred.o c - bill.o c - fred.o $ </source>

  • 이제 라이브러리를 만들었고, 두개의 오브젝트파일을 추가했다. 버클리 유닉스에서 파생된 몇몇 시스템에서는 라이브러리를 성공적으로 사용하기 위해 라이브러리 목록이 필요하다. 이 일은 ranlib라는 명령으로 처리한다. 하지만 리눅스와 같은 시스템에서 GNU 개발툴(build-essential)을 사용하면 이 과정은 필요없다.BSD에선 필요하다. 짜증

<source lang="bash"> $ ranlib lib.a </source>

  • 이제 라이브러리를 사용할 준비는 끝났다. 보통 프로그램을 만들 때 이러한 라이브러리를 추가할 수 있다.

<source lang="bash"> $ cc -o program program.o lib.a $program bill : you passed 헬로 월드 $ </source>

  • 오브젝트 파일이나, 라이브러리 또는 실행 가능한 프로그램에 어떤 함수가 포함돼있는지 알아보기 위해 nm이라는 명령어를 사용할 수 있다. program과 lib.a를 살펴보면, 라이브러리는 fred와 bill을 포함하고 있지만 program은 단지 bill만 포함하고 있다는걸 알 수 있다. 프로그램이 만들어질 때, 실제로 필요한 함수들만 라이브러리에 포함된다. 라이브러리의 모든 함수들이 선언된 헤더 파일을 포함한다고 해서 모든 라이브러리 함수들이 포함되는건 아니다.
  • 만약에 여러분이 MSDOS나 윈도우 소프트웨어 개발에 대해 좀 알고 있다면 몇가지 유사한 점을 살펴볼 수 있다.
Item Unix DOS / Windows
오브젝트 모듈 lib.a lib.lib
실행파일 program program.exe