[시스템] 정적 라이브러리? 알아볼게요 ( with. code )
정적 라이브러리❓
정적 라이브러리(static library)는 소프트웨어 개발에서 사용되는 코드 조각(함수, 클래스, 모듈 등)을 묶어서 하나의 파일로 만든 라이브러리 형태이며 이 라이브러리는 컴파일 시간에 실행 파일에 포함되며, 프로그램 실행 시 라이브러리의 코드가 복사되어 프로그램과 함께 동작한다. ( 정적 라이브러리 = 단순히 오브젝트(.o)들의 모임 )
- 라이브러리 개념: 라이브러리는 일련의 함수나 코드 조각을 묶어 재사용 가능한 형태로 저장한 것이다. 이를 통해 개발자는 비슷한 기능을 필요로 할 때마다 코드를 다시 작성하지 않고도 라이브러리를 사용하여 작업을 효율적으로 수행할 수 있다.
- 정적 라이브러리: 정적 라이브러리는 라이브러리의 코드가 실행 파일에 포함되어 실행 파일이 단독으로 실행될 수 있도록 하는 방식이다. 컴파일 시간에 라이브러리 코드가 실행 파일에 복사되므로, 실행 파일은 라이브러리에 대한 의존성이 있다. 이는 이식성이 떨어질 수 있지만, 실행 속도가 빠르고 라이브러리 버전 관리가 용이하다.
- 동적 라이브러리와의 차이: 정적 라이브러리와 대비되는 개념이 동적 라이브러리(dynamic library)이다. 동적 라이브러리는 실행 파일과 별도로 존재하며, 실행 시 필요한 라이브러리를 동적으로 로드한다. 동적 라이브러리는 실행 파일 크기를 줄이고 여러 프로그램에서 라이브러리를 공유할 수 있게 한다.
코드 예시
1. 소스코드 작성
먼저, 정적 라이브러리로 사용할 함수 또는 모듈을 포함하는 소스 코드를 작성한다. 예를 들어, 두 개의 정수를 더하는 함수를 간단하게 작성해보겠다.
// add.c
int add(int a, int b) {
return a + b;
}
2.컴파일
이제 소스 코드를 컴파일하여 오브젝트 파일(object file)을 생성합니다. 이 오브젝트 파일은 정적 라이브러리에 포함된다.
gcc -c add.c -o add.o
이 명령은 add.c 소스 코드를 컴파일하여 add.o 오브젝트 파일을 생성한다.
3. 정적 라이브러리 생성
오브젝트 파일을 사용하여 정적 라이브러리를 생성하고 ar 명령을 사용하여 라이브러리를 만들 수 있다.
ar rcs libadd.a add.o
위 명령은 libadd.a 라는 정적 라이브러리를 생성하고, add.o 오브젝트 파일을 이 라이브러리에 포함시킨다.
4. 라이브러리 사용
이제 정적 라이브러리를 사용하여 프로그램을 빌드한다. 아래는 라이브러리를 사용하는 예제 프로그램이다.
// main.c
#include <stdio.h>
int add(int a, int b); // 라이브러리 함수를 사용하기 위해 선언
int main() {
int result = add(5, 3);
printf("결과: %d\n", result);
return 0;
}
이 프로그램에서는 add 함수를 사용하기 위해 라이브러리를 호출하고 있다.
5. 프로그램 빌드
이제 main.c를 컴파일하고 정적 라이브러리를 링크하여 실행 파일을 생성한다.
gcc main.c -o myprogram -L. -ladd
- -L.: 현재 디렉토리에서 라이브러리를 찾아라.
- -ladd: libadd.a 라이브러리를 사용하라.
위의 프로그램을 컴파일 하기 위해서는 라이브러리의 위치와 어떤 라이브러리를 사용할것인지를 알려줘야 한다.
라이브러리의 위치는 '-L' 옵션을 이용해서 알려줄수 있으며, '-l' 옵션을 이용해서 어떤 라이브러리를 사용할것인지를 알려줄수 있다. -l 뒤에 사용될 라이브러리 이름은 라이브러리의 이름에서 "lib"와 확장자 "a"를 제외한 나머지 이름이다.
이제 myprogram이라는 실행 파일이 생성되었으며, 이 파일을 실행하면 정적 라이브러리의 기능을 사용하는 프로그램이 실행된다.
정적라이브러리 상태로 컴파일한 프로그램의 경우 컴파일시에 라이브러리가 포함되므로 라이브러리를 함께 배포할 필요는 없다.
