도전2022

라이브러리 테스트 본문

작업/리눅스

라이브러리 테스트

hotdigi 2010. 3. 22. 11:08
http://www.onurmark.co.kr/106

위에 있는 내용이 잘 되어 있지만 조금 보충 설명을 하여야 할듯하여 다시 기록한다.

라이브러리가 될 파일(test.c)
#include <stdio.h>
void func()
{
    printf("Hello World!!\n");
}

라이브러리를 사용하는 프로그램 (app.c)
int main()
{
    func();
    return 0;
}

1. 정적 라이브러리(또는 Archive)

정적라이브러리(또는 Archive)파일이라 불리우고 .a의 확장자를 가진다. 여러개의 오브젝트 파일들을 하나로 묶어 사용하기 때문에 Archive파일이라고 부른며 컴파일 시간에 코드를 포함하여 결정하기 때문에 정적 라이브러리라고 부른다. 위의 파일을 오브젝트 파일로 컴파일 한다.
# gcc -c test.c
# gcc -c app.c

test.o 파일과 app.o 파일이 생기는데 test.o 파일을 Archive로 묶어 보자. 라이브러리 파일의 작명법은 lib뒤에 이름을 붙이는 것이다.
# ar cr libtest.a test.o

libtest.a 파일이 생성되었을 것이며 이 라이브러리를 사용하여 컴파일 할려면 아래와 같이 한다. -L은 라이브러리 파일의 위치를 지정하며 -ltest가 libtest.a를 지정하게 된다. 
#gcc -o  app app.o -L. -ltest

(패스)

2. 동적 라이브러리

실행 시간에 라이브러리 파일을 찾아 코드를 포함하기 때문에 동적라이브러리라고 부른다. 즉, 정적 라이브러리는 컴파일 시간에 코드를 결정하기 때문에 소스가 변경되면 새로 컴파일 해야하지만, 동적 라이브러리의 경우 라이브러리만 교체하는 것으로도 변경이 가능하다. 
# gcc -c -fPIC test.c
# gcc -c app.c

-fPIC옵션은 Position-Independent Code의 약자이며 test.o파일을 동적라이브러리로 사용하도록 컴파일 하는 옵션이다. 이렇게 컴파일된 오브젝트 파일을 .so파일로 묶으면 된다. libtest.so 파일로 만들어 진다. 
# gcc -shared -fPIC -o libtest.so test.o

컴파일은 아래와 같이 하면 된다.
# gcc -o app app.o -L. -ltest

만일 libtest.a 파일과 libtest.so 파일이 같이 있을 경우 gcc 컴파일러는 libtest.so 파일을 먼저 지정하게 된다. 만일 libtest.a를 사용하여 컴파일 하고 싶으면 아래와 같이 실행하면 된다.
# gcc -static -o app app.o -L. -ltest

-ltest는 libtest.so 혹은 libtest.ar 파일을 가리키는 것이다. 




so 파이을 이용하는 실행 파일이 동작 되지 않을 때는 다음을 화인하여 보자.  
ldd app
linux-gate.so.1 =>  (0x00303000)
libtest.so => not found
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00698000)
/lib/ld-linux.so.2 (0x0024b000)

패스가 지정되어 있지 않은 경우이다. 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/MyCode
를 입력한다. 

ldd  app
linux-gate.so.1 =>  (0x00afc000)
libtest.so => /usr/MyCode/libtest.so (0x002ba000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x0043f000)
/lib/ld-linux.so.2 (0x00ed2000)


3. 동적 적제(DL) 라이브러리

특정 위치에 있는 라이브러리를 open 하여 사용하는 방법을 찾아 보자. 

4.5. DL 라이브러리 예제

여기에 있는 예제는 dlopen(3)의 맨페이지에 나오는 예제이다. 이 예제는 math라이브러리를 로드해서, 코사인 2.0을 출력한다. 또한, 각각의 단계에서 에러 체크를 한다(이렇게 하기를 추천한다).
    #include <stdlib.h>
    #include <stdio.h>
    #include <dlfcn.h>

    int main(int argc, char **argv) {
        void *handle;
        double (*cosine)(double);
        char *error;

        handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);
        if (!handle) {
            fputs (dlerror(), stderr);
            exit(1);
        }

        cosine = dlsym(handle, "cos");
        if ((error = dlerror()) != NULL)  {
            fputs(error, stderr);
            exit(1);
        }

        printf ("%f\n", (*cosine)(2.0));
        dlclose(handle);
    }


만약 이 프로그램의 파일이름이 "foo.c"라면, 다음과 같은 명령으로 프로그램을 만들 수 있을 것이다:
   # gcc -o Dltest Dltest.c -ldl

libm.so.6 파일을 로드하여 연산 결과 -0.416147을 출력한다. 



'작업 > 리눅스' 카테고리의 다른 글

리눅스용 개발 도구  (0) 2010.03.23
gcc coverage  (0) 2010.03.22
linux.die.net/man/  (0) 2010.03.12
시스템 관리자 명령어들  (0) 2010.03.12
Glibc 2 하우투 학습하기.  (0) 2010.03.11