Chapter 19.라이브러리
#include <stdio.h>
main()
{
if((fp= fopen("imsi", "r")) == NULL)
{
puts("그런 파일이 존재 하지 않습니다.");
exit(0);
}
...
}
위의 프로그램에서 에러 처리하는 부분은 원시적인방법이다. 이를 좀더 세련되게 변형시켜보자.
#include <stdio.h>
main()
{
void Fatal(char*);
FILE *fp;
if((fp= fopen("imsi", "r")) == NULL)
Fatal("fopen");
...
}
voidFatal(char *error_func)
{
perror(error_func);
exit(0);
}
에러가 발생하면 시스템적으로 에러 번호가 생성되는데, 이를 받아서 처리하는 함수가 perror()이다.
fopen()에 실패했을 때 에러를 처리하기 위해서4라인이 필요했는데 Fatal() 함수를 이용하면 한 라인으로 줄일수 있다.
단지 Fatal()이 필요한 곳마다 함수의 본체를 정의하든지 extern을 이용해야한다는 것이 조금 귀찮을 뿐이다.
이 귀찮음을 제거할수 있는 방법이 바로 ar이라는 유틸리티다.
Fatal.c
#include <stdio.h>
void Fatal(char *error_func)
{
perror(error_func);
exit(0);
}
#include <stdio.h>
main()
{
FILE *fp;
if((fp = fopen("imsi", "r")) == NULL)
Fatal("fopen");
}
gcc-o 19_1 19_1.c -lmy -L.
./19_1
fopen: No such file or directory
컴파일 해보니 에러 없이 잘 된다. Fatal()이라는 함수가 main() 안에 정의되어있지 않아도 잘 작동한다.
자신이 자주 사용하는 자신만의 라이브러리를 구축해놓고 이를 잘활요하면 생각보다 프로그램이 용이해질 수 있다.
라이브러리의 특징
- 유용한 함수들을 모아 놓은 집합체이다.
- 라이브러리는 파일명이 .a로 끝난다.
- 컴파일 과정을 거치면서 생성되는 .o파일들의 집합체이다.
- 무작위로라이브러리에 편입되는 것이 아니라 인덱스를 함유한 .o의 집합체이다.
- 매번 컴파일 할필요가 없다는 장점을 가지고 있으며 자신만의 라이브러리를 구축하여 처리할 수도 있다.
ar란
ar은 "Maintain Portable Archive or Library"라고 정의할 수 있다.
간이 저장소나 라이브러리를 관리할 수 있도록 도와주는 도구라는 말이다.
ar 옵션(/usr/ccs/bin)
ar key archiveName{filename }+
key
d: 라이브러리에 있는 파일을 삭제한다.
q :라이브러리의 끝에 파일을 추가한다. 파일이 존재해도 상관하지 않는다.
r :파일이 존재하지 않으면 라이브러리에 저장하고 그렇지 않으면 덮어 씌운다.
t :라이브러리에 저장된 파일들의 내용을 보여준다.
라이브러리 생성 단계
1. 자주 사용하는 함수 만들기
void Fatal(char *error_func)
{
perror(error_func);
exit(0);
}
2.오브젝트 파일생성하기
gcc -cFatal.c
gcc로 컴파일 할 때 -c 옵션을이용하여오브젝트파일만 생성한다.
-c 옵션을 생략하면링커가 main()함수를 찾기 때문에 에러가 발생한다.
3. 오브젝트 파일 라이브러리에 포함시키기
ar rlibmy.a Fatal.o
ar유틸리티를 이용하여 라이브러리 파일에 편입시키는과정이다.
r옵션으로 libmy.a라는 라이브러리에 Fatal.o을 추가한다.
라이브러리 이름은 libmy.a로 지정하고있는데 lib라는 이름과.a라는 확장자는 생략할 수 없다(생략 하지 말자).
ar t libmy.a
t 옵션으로 libmy.a에 Fatal.o가 저장되어있는지 확인한다.
4.기존 프로그램에 라이브러리를포함시키키
#include <stdio.h>
main()
{
FILE *fp;
if((fp = fopen("imsi", "r")) == NULL)
Fatal("fopen");
}
gcc -o 19_1 19_1.c -lmy
위 프로그램은 컴파일 되는중에 Fatal()을 만나면libmy.a에서Fatal()을 찾게 되므로 Fatal() 함수가 정의되지 않았다는 에러 메시지를 만나지 않을 것이다.
주의 할 것은 -l옵션 다음에는 lib와 .a를 생략해야 하며-L 옵션을 반드시 사용해야 한다.
-L 옵션을 사용하지 않으면/usr/lib, /usr/local/lib에서 libmy.a 라이브러리를 찾게 된다.
자신이 만든 라이브러리를 컴파일러가 찾도록 하기 위해-L.을 이용해야 한다.
가끔 자신만의 라이브러리가 복잡해져서 정렬을 하고 싶은 때가 있다.이때 다음 팁을 이용해보자.
ar crlibmy.a`lorder liborigianl.a |tsort`
원래의 라이브러리는 liboriginal.a이며 새로이 정렬된 라이브러리는libmy.a가 된다.
보통 자신의 라이브러리를 하나의 디렉토리에 몰아놓고 다음을 많이 사용한다.
ar cr libmy.a`lorder*.o | tsort
'C언어' 카테고리의 다른 글
makefile 만들기 (0) | 2011.10.16 |
---|---|
Chapter 18. 메모리 할당과 해제 (0) | 2011.10.16 |
Chapter 15. 함수 인자 포인터 (0) | 2011.10.16 |
Chapter 16. 함수 포인터 (0) | 2011.10.16 |
Chapter 17. 구조체와 포인터 (0) | 2011.10.16 |