정적 라이브러리란?
여러 함수 및 데이터들을 가지고 있는 파일을 라이브러리라고 할 수 있습니다. 이 라이브러리를 사용할 수 있는 방법은 2가지로 정적과 동적이 있습니다. 정적 라이브러리는 컴파일 시 링커가 컴파일된 파일과 사용된 라이브러리들을 합쳐서 하나의 exe 파일로 만들어 주는 것이라고 할 수 있습니다
다르게 말하면 내가 코드를 작성 할 떄 어떤 라이브러리에 있는 함수를 사용했다고 합시다. 컴파일 과정에서 링커는 함수가 위치한 라이브러리 파일(.lib)를 코드와 데이터들이 있는 파일(.obj)과 합쳐 실행파일(.exe)을 만들게 됩니다. 이 파일을 실행한다면 코드, 데이터, 라이브러리 모두 메모리에 로드 될 것 입니다.
정적라이브러리 구현하기
1. 리눅스
<실행 환경>
간단한 파일 4개를 만들어 주겠습니다
obj1.c
#include<stdio.h>
void testfunc1( ) {
printf("Test Function1\n");
}
obj2.c
#include<stdio.h>
void testfunc2( ) {
printf("Test Function2\n");
}
libmylib.h
void testfunc1();
void testfunc2();
test.c
#include<stdio.h>
#include"libmylib.h"
// 라이브러리 내 함수들 사용
testfunc1();
testfunc2();
우리가 알고 있는 상식을 보면 test 파일은 libmylib.h 을 포함 시켰지만 사용한 함수들에 대한 정의는 포함 시켜주지 않았습니다. 이것을 그냥 실행 한다면 에러가 날 것입니다. 그러지 않기 위해서 우리는 obj1, obj2 파일을 하나의 라이브러리 파일로 만들어준 후 test.c를 exe로 만들 때 링킹 해줄 것입니다.
BASH
# 코드 파일을 오브젝트 파일로 바꾸어 줍니다
$ gcc -c obj1.c obj2.c
# 해당 오브젝트 파일들을 하나의 라이브러리로 만들어 줍니다
$ rc rscv libmylib.a obj1.o obj2.o
# test를 컴파일 할 떄 링커 옵션을 주어 libmylib.a을 링크 시켜줍니다
$ gcc -o test test.c -L./ -lmylib # <옵션> -L : 라이브러리를 찾아볼 디렉토리 ; -ㅣ: 처음 lib와 .a 가 포함되지 않은 라이브러리명 ;
$ ./test
Test Function1
Test Function2