AnsiC Prototype
- C언어 라이브러리 만들기
출처
C언어 라이브러리 만들기
자주 쓰는 함수들을 라이브러리 형태로 만들어 두면, 프로그램을 짤 때 편리합니다. 예를 들어서 함수 Function이 mylib.c 라는 소스코드에 정의되어 있고, 프로토타입이 mylib.h 라는 헤더 파일에 선언되어 있다면,
//mylib.h
double Function(double x);
//mylib.c
double Function(double x){
double ret;
... 함수의 본체 ...
return ret;
}
- 우선 mylib.c 를 컴파일해서 오브젝트 파일을 만듭니다.
- [정적 라이브러리(static library)의 경우] gcc -c mylib.c
- [동적 라이브러리(shared library)의 경우] gcc -fPIC -c mylib.c
- 오브젝트 파일로부터 라이브러리를 생성합니다.
- 볼드체로 표시된 mylib 부분을 적당한 이름으로 바꿔줍니다.
- [정적 라이브러리(static library)의 경우] ar rc libmylib.a mylib.o
- [동적 라이브러리(shared library)의 경우] gcc -shared -o libmylib.so mylib.o
- 정적 라이브러리의 경우 libmylib.a 라이브러리 내의 인덱스를 만듭니다.
- ranlib libmylib.a
이렇게 만들어진 라이브러리를 다른 프로그램에서 사용할 때는 mylib.h 를 포함시켜 주고, -lmylib 라는 옵션을 통해 링크시켜 주면 됩니다. 예를 들어서 다음과 같은 main.c 소스코드가 있다면,
main.c
...
#include<mylib.h>
...
int main(){
...
double x,y;
...
y = Function(x);
...
}
컴파일을 다음과 같이 해줍니다.
gcc main.c -o run.out -I[mylib.h 의 위치] -L[libmylib.a(so) 의 위치] -lmylib
예를 들어서 mylib.h 와 libmylib.a(so) 가 /homes/INCLUDE 와 /homes/LIBRARY 에 각각 저장되어 있다면,
gcc main.c -o run.out -I/homes/INCLUDE -L/homes/LIBRARY -lmylib
라고 해줍니다.
터미널 콘솔을 열때 미리 경로를 지정해주면, -I 및 -L 옵션을 생략할 수 있는데,
[bash shell 의 경우] 홈디렉토리에 있는 .bashrc 파일을 열어서
export C_INCLUDE_PATH=/homes/INCLUDE
export LIBRARY_PATH=/homes/LIBRARY
를 추가합니다.
[TC shell 의 경우] 홈디렉토리에 있는 .tcshrc 파일을 열어서
setenv C_INCLUDE_PATH /homes/INCLUDE
setenv LIBRARY_PATH /homes/LIBRARY
를 추가합니다.
이렇게 하면, 컴파일러는 /homes/INCLUDE 에 있는 헤더파일과 /homes/LIBRARY 에 있는 라이브러리들을 자동으로 탐색하므로, -I 및 -L 옵션이 필요없죠.