라이브러리

|

입력을 받는 함수 3개( scanf(), getch(), gets() ),
출력을 하는 함수 3개( printf(), putch(), puts() )를 만들었다.
또한 수학 관련 함수 5개를 만들었다.
그리고 네트워크 관련 함수 4개도 만들었다.
이것을 각각 컴파일하여 15개의 오브젝트 파일을 만들어 놓았다.
그리고 헤더 파일도 15개 만들어 놓았다.

이제 main() 함수에서 #include로 필요한 함수의 헤더 파일을 포함시켜주고 그 함수를 사용하면 된다.
그리고 컴파일할 때 main() 함수에서 사용한 함수들의 오브젝트 파일을 포함시켜 컴파일해 주면 된다.
그런데 사용한 함수가 15개라면 아래와 같이 해야 할 것이다.
$ gcc -o main.c scanf.o getch.o gets.o printf.o putch.o puts.o ...
쓸 만하다. 
하지만 사용한 함수가 100개라면 어떻게 할 것인가?

그래서 라이브러리 개념을 도입한다.
잘 아는 단어이다. '도서관'이라는 뜻인데 이것이 컴파일과 무슨 관련이 있다는 것인가?
도서관에는 많은 책들이 있다. 그런데 이 많은 책들이 마구 섞여 있지 않고 잘 분류되어 있다는 것이다.
주제에 맞게 책을 분류하고 분류기호를 정해 놓았기 때문에 이 기호를 보고 원하는 책을 빨리 찾을 수 있다.

자, 다시 컴파일로 돌아오자.
15개의 함수를 입출력, 수학, 네트워크 이렇게 3개로 분류하면 좋을 것 같다.
그리고 각각을 libio, libmath, libnet라고 이름을 붙이자. (반드시 앞에 lib를 붙여주어야 함)
그래서 scanf() 함수를 찾으려면 libio를 찾아가면 되는 것이다.

이제 직접 라이브러리를 만들어보자.
GCC에서는 ar이라는 명령어로 라이브러리를 만들 수 있다.
우리는 3개로 분류하였으므로
libio.a
libmath.a
libnet.a
라는 3개의 파일이 만들어진다.
libio.a는 6개의 입출력 오브젝트 파일을 포함하고 있다.
나머지 파일도 해당 오브젝트 파일을 포함하고 있다.

이제 이 라이브러리 파일을 이용해서 컴파일을 하면 된다.
$ gcc -o main main.c -lio lmath lnet -L.
-l 뒤에 lib와 .a를 뺀 io, math, net를 써주면 된다.
-L 뒤에 라이브러리 파일이 포함된 경로를 포함시켜 준다. main.c와 같은 경로라면 .만 찍어 준다.



$ vi input.c
#include <stdio.h>

int input()
{
int in;
printf("What is your favorite number: ");
scanf("%d", &in);
return in;
}
:wq

$ vi output.c
#include <stdio.h>

void output(int out)
{
printf("Your favorite number is %d.\n", out);
}
:wq

$ vi main.c
#include <stdio.h>

int main()
{
int num;
num = input();
output(num);
return 0;
}
:wq

$ vi input.h
extern int input();
:wq

$vi output.h
extern void output(int)
:wq

$ ls
input.c  input.h  main.c  output.c  output.h
$ gcc -c input.c output.c
$ ls
input.c  input.h  input.o  main.c  output.c  output.h  output.o

$ ar r libmylib.a input.o output.o
ar: creating libmylib.a
$ ls
input.c  input.h  input.o  libmylib.a  main.c  output.c  output.h  output.o

$ ar s libmylib.a
$ ls
input.c  input.h  input.o  libmylib.a  main.c  output.c  output.h  output.o

$ ar t libmylib.a
input.o
output.o
$ ls
input.c  input.h  input.o  libmylib.a  main.c  output.c  output.h  output.o

$ gcc -o main main.c -lmylib -L.
$ ls
input.c  input.h  input.o  libmylib.a  main  main.c  output.c  output.h  output.o

$ ./main
What is your favorite number: 3
Your favorite number is 3.






'Compile 강좌' 카테고리의 다른 글

[컴파일 강좌] 2강 - C++ 분할 컴파일  (0) 2010.06.22
[컴파일 강좌] 1강 - C 분할 컴파일  (0) 2010.06.21
컴파일러 옵션  (0) 2010.05.30
And