라이브러리(2)

Language/C 2011. 9. 8. 10:06

참조: http://blog.naver.com/cdcsman?Redirect=Log&logNo=70016825391

 다음과 같은 코딩을 위해 C 라이브러리를 만들려고 한다.

<Goal>

interface.h, interface.c, application.c

interface.h: interface만을 정의해 놓은 헤더

interface.c: interface가 가지고 있는 function의 declaration

application.c: interface.h를 인클루드하여 function을 사용하는 어플리케이션 작성

<Method>

테스트 삼아 정적 라이브러리와 공유 라이브러리를 이용해 본다.

1. 정적 라이브러리

확장자가 .a로 끝나는 라이브러리로 프로그램이 컴파일 될 때 라이브러리를 프로그램에 직접 링크한다.  많이 사용하면 할수록 프로그램에 라이브러리가 더해지기 때문에 프로그램 사이즈가 커진다. 라이브러리는 ‘lib이름.a’ 형식으로 지어지며 사용은 ‘gcc -l이름’으로 사용한다.

* 사용하기

a. object 파일 생성

$ gcc -c interface.c

$ ls

interface.h interface.c interface.o application.c

b. ar 명령 사용하여 라이브러리 파일 만듬

$ar r libtest.a interface.o [ar r archivename filenames]

c. 라이브러리 파일의 사용

$ gcc application.c -o application -ltest -L/home/somebody/lib

-L을 이용하여 라이브러리 파일의 경로를 설정하거나 (-L/directory…)

xeport를 이용하여 환경 변수 설정 (export LD_LIBRARY_PATH=$HOME/lib)

2. 공유 라이브러리

확장자가 .so로 끝나며 프로그램이 컴파일 될 때 직접 링크되지 않고 실행할 때 로드되어 사용된다. 따라서 실행 파일의 크기가 증가하지 않으며 메모리에 로드된 라이브러리는 여러 프로그램에 의해 공유된다.

* 사용

a. object 파일 만들기. 이 때 -fpic 옵션을 주어 위치 독립적인 코드를 생성한다.

$ gcc -fpic -c inteface.c

$ ls

interface.h interface.c interface.o application.c

b. object 파일을 포함하는 공유 라이브러리 파일을 만든다.

$ gcc -shared -o libinterface.so.0.1.1 interface.o

c. 불려질 라이브러리 이름(lib이름.so)를 실제 라이브러리 이름과 심볼릭 링크한다.

$  ln -s libinterface.so.0.1.1 libinterface.so

d. 환경 변수를 설정한다.

$ export LD_LIBRARY_PATH=$HOME/lib

e. 실행 파일 생성

$ gcc application.c -o application -linterface

'Language > C' 카테고리의 다른 글

모듈과 라이브러리  (0) 2011.09.08
라이브러리 공격  (0) 2011.09.08
라이브러리(1)  (0) 2011.09.08
library 의 사용  (0) 2011.09.08
gcc 컴파일 과정 요약  (0) 2011.09.07
: