본문으로 바로가기

정적 라이브러리

category 카테고리 없음 2019. 1. 22. 11:20

정적 라이브러리란?

여러 함수 및 데이터들을 가지고 있는 파일을 라이브러리라고 할 수 있습니다. 이 라이브러리를 사용할 수 있는 방법은 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