Language/C

📌 Chapter 18 - 정적 라이브러리와 동적 라이브러리 활용

e-cko 2025. 6. 26. 17:01
반응형

1. 라이브러리란?

  • 라이브러리(library)는 자주 사용하는 함수를 하나의 파일로 묶어 재사용할 수 있도록 만든 것이다.
  • 프로젝트에 필요한 기능만 따로 묶어놓기 때문에, 코드 재사용성빌드 효율성이 크게 향상된다.
반응형

1) 종류 구분

구분 확장자 연결 시점 특징
정적 라이브러리 .a 컴파일 시 컴파일 시 소스에 통합됨 (용량 ↑)
동적 라이브러리 .so 실행 시 (런타임) 실행 파일과 별개로 존재 (유지 ↑)

✳️ 대부분의 C 표준 라이브러리도 .a 또는 .so 형태로 제공된다.


2. 정적 라이브러리 만들기 (.a)

1) 소스 및 헤더 구성

🔧 기존 예제(math_utils)를 기반으로 정적 라이브러리를 만들어보자.

// math_utils.h

#ifndef MATH_UTILS_H

#define MATH_UTILS_H

 

int add(int a, int b);

int subtract(int a, int b);

 

#endif

 

c

// math_utils.c

#include "math_utils.h"

 

int add(int a, int b) {

    return a + b;

}

 

int subtract(int a, int b) {

    return a - b;

}


2) 라이브러리 생성 명령

gcc -c math_utils.c             # 1. 개별 객체 파일 생성 → math_utils.o

ar rcs libmath.a math_utils.o  # 2. 정적 라이브러리 생성 → libmath.a

📁 생성된 libmath.a는 다른 프로젝트에서도 재사용 가능하다.


3) 라이브러리 사용 예제

// main.c

#include <stdio.h>

#include "math_utils.h"

 

int main() {

    printf("3 + 2 = %d\n", add(3, 2));

    printf("3 - 2 = %d\n", subtract(3, 2));

    return 0;

}


4) 컴파일 방법

gcc main.c -L. -lmath -o program

✔️ 옵션 설명:

  • -L.: 현재 디렉토리에서 라이브러리 검색
  • -lmath: libmath.a를 연결
  • -o program: 실행 파일 이름

3. 동적 라이브러리 만들기 (.so)

1) 소스 및 헤더 동일

🔁 소스는 그대로 두고, 컴파일 방식만 변경한다.

gcc -fPIC -c math_utils.c               # 1. PIC(주소 독립 코드) 옵션으로 컴파일

gcc -shared -o libmath.so math_utils.o # 2. 공유 라이브러리 생성

libmath.so는 런타임에 연결되는 동적 라이브러리이다.


2) 동적 라이브러리 사용 예제

// main.c (동일)

#include <stdio.h>

#include "math_utils.h"

 

int main() {

    printf("7 + 5 = %d\n", add(7, 5));

    printf("7 - 5 = %d\n", subtract(7, 5));

    return 0;

}


3) 컴파일 및 실행

gcc main.c -L. -lmath -o program

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH  # 동적 라이브러리 경로 설정

./program

📌 LD_LIBRARY_PATH 환경변수를 설정하지 않으면 .so를 찾지 못한다.


마무리 정리

1️ 라이브러리는 자주 사용하는 함수의 집합이다.
2️
.a는 정적 라이브러리로 컴파일 시 포함되고, .so는 동적 라이브러리로 실행 시 연결된다.
3️
ar rcs 명령어로 .a 파일을 만들 수 있고, -shared 옵션으로 .so를 생성한다.
4️
-L, -l 옵션을 사용하여 라이브러리를 컴파일 시 연결한다.
5️
동적 라이브러리를 실행하려면 LD_LIBRARY_PATH를 설정해야 한다.

 

반응형