소프트웨어 개발에서 라이브러리는 코드의 재사용성을 높이고, 개발 시간을 단축하는 데 중요한 역할을 함
라이브러리는 크게 정적 라이브러리와 동적 라이브러리로 구분됨
이번 글에서는 정적 라이브러리와 동적 라이브러리의 개념과 차이점, 그리고 라이브러리 생성 및 링크 과정에 대해 정리함
정적 라이브러리(Static Library)란?
정적 라이브러리는 링크 타임에 프로그램에 결합되며, 코드가 실행 파일에 포함되는 라이브러리
특징
- 확장자: .a (Unix 계열), .lib (Windows)
- 링크 시점: 컴파일 후 링크 타임에 실행 파일에 결합됨
- 파일 크기: 모든 필요한 라이브러리 코드가 포함되어 실행 파일 크기가 커질 수 있음
- 독립성: 실행 파일에 라이브러리의 모든 코드가 포함되므로, 실행 시 별도의 라이브러리가 필요하지 않음
- 업데이트: 라이브러리를 업데이트하려면 실행 파일을 다시 컴파일하고 링크해야 함
로드 방식
- 링크 타임에 포함: 정적 라이브러리는 프로그램이 링크될 때 실행 파일에 포함됨
이는 라이브러리의 코드가 실행 파일에 직접 결합되어 독립적인 실행 파일이 생성됨을 의미함
결과적으로, 실행 시 별도의 라이브러리 파일이 필요하지 않음
동적 라이브러리(Dynamic Library)
동적 라이브러리는 코드가 실행파일에 포함되지 않으며, 일반적으로 실행 시간에 로드되는 라이브러리
특징
- 확장자: .so (Unix 계열), .dll (Windows)
- 링크 시점: 실행 시간에 라이브러리가 로드됨
- 파일 크기: 라이브러리 코드가 포함되지 않기 때문에 실행 파일 크기가 정적라이브러리에 비해 작음
- 공유성: 여러 프로그램이 하나의 라이브러리를 공유하여 메모리 사용량을 줄일 수 있음
- 업데이트: 라이브러리를 업데이트해도 실행 파일을 다시 컴파일할 필요가 없음
로드 방식
- 런타임 로드: 일반적으로 프로그램이 실행되는 동안 동적 라이브러리가 로드됨
이 방식은 라이브러리 파일이 실행 파일과 별도로 유지되며, 필요할 때마다 로드 - 프리로드: 일부 시스템에서는 프로그램이 실행될 때 특정 동적 라이브러리를 미리 로드할 수 있음
이를 통해 실행 시간 동안 필요한 라이브러리가 즉시 사용 가능함
환경 변수(LD_PRELOAD 등)를 사용하여 특정 라이브러리를 미리 로드할 수 있음
라이브러리 생성 과정
라이브러리를 생성하는 과정은 여러 객체 파일을 하나의 라이브러리 파일로 묶는 것을 포함
정적 라이브러리와 동적 라이브러리 생성 과정은 다소 다름
정적 라이브러리 생성
- 소스 코드 컴파일
- 소스 코드를 컴파일하여 객체 파일을 생성함
- gcc -c libmath.c -o libmath.o
- 정적 라이브러리 생성
- 여러 객체 파일을 하나의 정적 라이브러리 파일로 묶음
- ar rcs libmath.a libmath.o
동적 라이브러리 생성
- 소스 코드 컴파일
- 동적 라이브러리를 생성할 때는 위치 독립 코드(Position Independent Code)를 생성해야 함
- gcc -fPIC -c libmath.c -o libmath.o
- 동적 라이브러리 생성
- 객체 파일을 동적 라이브러리로 묶음
- gcc -shared -o libmath.so libmath.o
라이브러리 링크 과정
생성된 라이브러리를 사용하여 실행 파일을 만드는 과정은 링크 단계에서 이루어짐
정적 라이브러리 링크
정적 라이브러리를 포함하여 실행 파일을 생성함
정적 라이브러리의 모든 코드가 실행 파일에 포함
- gcc -o myprogram myprogram.c -L. -lmath
동적 라이브러리 링크
동적 라이브러리를 포함하여 실행 파일을 생성함
실행 파일에는 동적 라이브러리를 참조하는 코드만 포함되고, 라이브러리는 실행 시 로드됨
- gcc -o myprogram myprogram.c -L. -lmath
동적 라이브러리 로드 설정
동적 라이브러리를 실행 파일이 실행되는 동안 찾을 수 있도록 환경 변수를 설정
- export LD_LIBRARY_PATH=.
결론
정적 라이브러리와 동적 라이브러리는 각각의 장단점을 가지고 있으며, 특정 상황에 따라 적절히 선택하여 사용해야 함
라이브러리 생성과 링크는 소프트웨어 개발의 서로 다른 단계이지만, 실행 파일을 만들기 위해 모두 필요함
생성된 라이브러리를 링크 과정에서 사용하여 최종 실행 파일을 만드는 것이 이 두 과정의 주요 역할임
개발 환경과 배포 방식에 따라 적합한 라이브러리 방식을 선택하여 효율적인 소프트웨어 개발을 할 수 있음
'Computer Science' 카테고리의 다른 글
메모리 단편화 (0) | 2024.08.14 |
---|---|
운영체제의 역할과 필요성 (0) | 2024.08.08 |
링커의 심벌해석 대상 (3) | 2024.07.24 |
지역 심벌과 전역 심벌 (0) | 2024.07.24 |
링커란? (0) | 2024.07.17 |