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를 설정해야 한다.
'Language > C' 카테고리의 다른 글
| 📌 예제 - 도서 관리 프로그램 (0) | 2025.07.04 |
|---|---|
| 📌 Chapter 19 - 고급 기법 (8) | 2025.07.03 |
| 📌 Chapter 17 - 선행처리기와 다중 소스 파일 - Makefile (1) | 2025.06.24 |
| 📌 Chapter 17 - 선행처리기와 다중 소스 파일 - 헤더 파일 분리와 다중 소스 파일 관리 (1) | 2025.06.24 |
| 📌 Chapter 17 - 선행처리기와 다중 소스 파일 - Include Guard (0) | 2025.06.24 |