본문 바로가기
대외활동/시스템프로그래밍

라이브러리

by hoshi03 2024. 8. 22.

정적 라이브러리, 동적 라이브러리

 

 

  • 컴파일 시점:
    • 정적 라이브러리: 컴파일 시 라이브러리 코드가 실행 파일에 포함됨.
    • 동적 라이브러리: 컴파일 시 라이브러리 참조만 포함되고, 실행 시 로드됨.
  • 배포:
    • 정적 라이브러리: 별도로 라이브러리를 배포할 필요 없음.
    • 동적 라이브러리: 라이브러리를 별도로 배포하거나, 시스템에 미리 설치되어야 함.
  • 파일 크기:
    • 정적 라이브러리: 실행 파일 크기가 큼.
    • 동적 라이브러리: 실행 파일 크기가 작음.
  • 유연성 및 유지보수:
    • 정적 라이브러리: 라이브러리 수정 시 프로그램을 다시 컴파일해야 함.
    • 동적 라이브러리: 라이브러리를 교체하면 프로그램을 다시 컴파일하지 않아도 됨.

- 동적 라이브러리 예제

 

공유 라이브러리를 handle에 지정해주고

dlsym으로 지정해둔 메서드를 가져와서 사용할 수 있다

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <gnu/lib-names.h> 

int main(void)
{
    void *handle;
    int (*add) (int, int);
    int (*multiply)(int, int);
    char *error;

    handle = dlopen("/home/hoshi03/lib/libcalc.so", RTLD_LAZY);
    if (!handle)
    {
        fprintf(stderr, "%s\n", dlerror());
        exit(EXIT_FAILURE);
    }

    dlerror(); /* Clear any existing error */

    add = (int (*)(int, int))dlsym(handle, "add");
    multiply = (int (*)(int, int))dlsym(handle, "multiply");

    error = dlerror();
    if (error != NULL)
    {
        fprintf(stderr, "%s\n", error);
        exit(EXIT_FAILURE);
    }

    printf("%d\n", (*add)(2,5));
    printf("%d\n", (*multiply)(2,5));
    dlclose(handle);
    exit(EXIT_SUCCESS);
}

 

 

'대외활동 > 시스템프로그래밍' 카테고리의 다른 글

시험대비 c++ 복습  (0) 2024.08.25
시험대비 C 복습  (0) 2024.08.23
0822 gdb, core, valgrind  (0) 2024.08.22
보이드 포인터, 함수 포인터 복습  (0) 2024.08.21
리눅스 쉘 스크립트 조건문  (0) 2024.08.21