AnsiC Prototype

From 흡혈양파의 인터넷工房
Jump to navigation Jump to search
C언어 라이브러리 만들기

출처
C언어 라이브러리 만들기


자주 쓰는 함수들을 라이브러리 형태로 만들어 두면, 프로그램을 짤 때 편리합니다. 예를 들어서 함수 Function이 mylib.c 라는 소스코드에 정의되어 있고, 프로토타입이 mylib.h 라는 헤더 파일에 선언되어 있다면,

//mylib.h

double Function(double x);
//mylib.c

double Function(double x){
double ret;
... 함수의 본체 ...
return ret;
}
  1. 우선 mylib.c 를 컴파일해서 오브젝트 파일을 만듭니다.
    • [정적 라이브러리(static library)의 경우] gcc -c mylib.c
    • [동적 라이브러리(shared library)의 경우] gcc -fPIC -c mylib.c
  2. 오브젝트 파일로부터 라이브러리를 생성합니다.
    • 볼드체로 표시된 mylib 부분을 적당한 이름으로 바꿔줍니다.
    • [정적 라이브러리(static library)의 경우] ar rc libmylib.a mylib.o
    • [동적 라이브러리(shared library)의 경우] gcc -shared -o libmylib.so mylib.o
  3. 정적 라이브러리의 경우 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 옵션이 필요없죠.


출처 : http://randu.org/tutorials/c/libraries.php