다음 이전 차례

6. 사용법의 예시

아래 부터는 (정적, 공유 및 동적 라이브러리의)세가지 형태의 모든 라이브 러리의 예이다. libhello.c는 libhello.h를 헤더로 하는 보통의 라이브러리이며, demo_use.c는 libhello.c를 호출하는 평범한 프로그램이다. 그 다음에는 이것이 어떻게 정적 및 공유라이브러리로 사용되는가의 예를 보여주는 스크립트 (script_static, script_shared)가 주석과 함께 있으며, 그 다음에는 공유 라이 브러리가 어떻게 동적 라이브러리로 사용되는지를 보여주는 demo_ dyanmic.c와 script_dynamic이 있다.

File libhello.c /* libhello.c - 라이브러리로 사용되는 파일 */ #include <stdio.h> void hello(void) printf("Hello, library world.");


File libhello.h
/* libhello.h - 헤더 파일 */

void hello(void);

File demo_use.c /* demo_use.c -- 바로 hello루틴을 사용하는 예 */ #include "libhello.h" int main(void) { hello(); return 0; }


File script_static
#!/bin/sh
# 정적 라이브러리 데모
# 정적 라이브러리의 오브젝트 파일인 libhello-static.o생성.
# libhello-static이라는 이름을 사용하는 것은 정적 라이브러리
# 와 동적 라이브러리 사용을 엄연히 구별하기 위한것일 뿐이므
# 로 -static이라는 이름을 오브젝트 파일이나 정적 라이브러리에
# 쓸 필요는 없다.
gcc -Wall -g -c -o libhello-static.o libhello.c
# 정적 라이브러리의 생성.
ar rcs libhello-static.a libhello-static.o
# 여기서 libhello-static.a를 나중에 사용하기
# 위해 어딘가에 복사해 놓을수 있을 것이다.
# 데모 목적으로 사용하기 위해서 우리는
# 현재의 디렉토리에 라이브러리를 두기로 한다.
# demo_use 프로그램의 컴파일 
gcc -Wall -g -c demo_use.c -o demo_use.o
# demo_use 프로그램의 생성; -L. 옵션은 "." 가 프로그램
# 의 생성시에 검색되게 한다.  이 명령으로 libhello-static.a에 
# 있는 관련된 오브젝트가 파일 demo_use_static에 삽입된다.
gcc -g -o demo_use_static demo_use.o -L. -lhello-static
# 프로그램의 실행
./demo_use_static
  


File script_shared
#!/bin/sh
# 공유 라이브러리의 데모
# 공유 라이브러리의 오브젝트 파일 libhello.o의 생성.
gcc -fPIC -Wall -g -c libhello.c
# 공유 라이브러리의 생성.
# -lc를 사용하여 C 라이브러리와 링크한다. 왜냐하면
# libhello가 C 라이브러리에 의존되기 때문이다.
gcc -g -shared -Wl,-soname,libhello.so.0 \
   -o libhello.so.0.0 libhello.o -lc
# 여기서 libhello.so.0.0를 어떤 디렉토리 이를테면 
# /usr/local/lib에 복사하여도 된다.
# 이제 ldconfig를 이용 심볼릭 링크를 만든다.
# soname을 셋업함.  아래와 같이 해도 무방하다.
# ln -sf libhello.so.0.0 libhello.so.0
# 여기서는 그냥 ldconfig로 하도록 한다.
/sbin/ldconfig -n .
# linker name을 셋팅한다.
# 좀더 면밀하게 하려면 이미 존재하는 linker name이
# 있는지 확인해보고 만약 그렇다면 그냥 놔둬야 할지
# 아닌지를 잘 체크해야한다.
ln -sf libhello.so.0 libhello.so
# demo_use 프로그램 파일을 컴파일한다.
gcc -Wall -g -c demo_use.c -o demo_use.o
# demo_use 프로그램의 생성.
# -L. 은 "." 이 프로그램의 생성시에 검색되도록
# 한다. "." 가 프로그램 실행시에 검색되는 것이
# 아님에 유의하라.
gcc -g -o demo_use demo_use.o -L. -lhello
# 프로그램 실행. LD_LIBRARY_PATH를 사용
# 하여 공유 라이브러리가 어디에 있는가를
# 프로그램에 알려 주어야한다.
LD_LIBRARY_PATH="." ./demo_use

File demo_dynamic.c /* demo_dynamic.c -- "hello" routine의 동적적재와 사용의 예 */

/* dlfcn.h 파일이 동적적재 라이브러리 루틴에 필요함 */ #include <dlfcn.h> #include <stdio.h> /* "libhello.h"를 include할 필요가 없음에 유의하라. 그렇지만 그와 관련하여 어떤 것은 반드시 명시해야한다; 즉, dlsym()으로 얻은 값을 가지고 있을 데이터의 타잎 은 분명히 정해져야 한다. */ /* "simple_demo_function" 타잎은 매개변수와 리턴값이 없는 함수의 타잎을 말한다. */ typedef void (*simple_demo_function)(void);

int main(void) const char *error; void *module; simple_demo_function demo_function; /* 동적 라이브러리를 적재함 */ module = dlopen("libhello.so", RTLD_LAZY); if (!module) fprintf(stderr, "Couldn't open libhello.so: %s", dlerror()); exit(1);

/* 심볼을 가져옴 */ dlerror(); demo_function = dlsym(module, "hello"); if ((error = dlerror())) fprintf(stderr, "Couldn't find hello: %s", error); exit(1);

/* DL 라이브러리의 함수를 호출한다. */ (*demo_function)(); /* 모든 것을 마친 뒤 확실히 클로징한다. */ dlclose(module); return 0;


   
File script_dynamic
#!/bin/sh
# 동적 라이브러리 데모
# libhello.so와 friends가 이미
# 생성되었음을 가정한다. ( dynamic의 예를 보라).
# demo_dynamic 프로그램을 오브젝트 파일로 컴파일.
gcc -Wall -g -c demo_dynamic.c
# demo_use 프로그램의 생성.
# 이 프로그램이 사용하는 특정의 라이브러리는 프로그램이
# 시작되고 난뒤가 되기 전까지는 적재되지 않기 때문에 동적
# 라이브러리를 찾기위해 어디를 검색해야 하는지 알릴 필요가
# 없음에 유의하라.
# 그렇지만 동적 라이브러리를 적재하는 라이브러리를 
# 포함하기 위해서 -ldl옵션은 반드시 필요하다.
gcc -g -o demo_dynamic demo_dynamic.o -ldl
# 프로그램의 실행. LD_LIBRARY_PATH 를 이용하여
# 프로그램이 어디서 동적 라이브러리를 얻을수 
# 있는지 알려 주어야 한다.
.
LD_LIBRARY_PATH="." ./demo_dynamic


다음 이전 차례