라이브러리(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 |