본문 바로가기
개발 이야기/리눅스 이야기

Linux Ubuntu C 정적 라이브러리 생성하여 사용하기

by 런던살자 2019. 6. 21.

안녕하세요 마블랑입니다.

 

프로그램을 개발하면서 하나부터 열까지 개발을 하는 경우는 공부를 위해 하는 것이 아니라면 거의 없다고 보면됩니다.

 

기본적으로는 미리 구현되어 있는 출력이나 입력 등 기본 함수를 사용할 것이고 필요에 따라서 오픈소스나 상용 라이브러리를 이용하여 프로그램의 생산성을 증대 시킬수 있습니다. 

 

그렇게 배포되는 라이브러리는 배포를 할때 코드를 공개하지 않고 사용할 수 있게 해주기 때문에 배포하는 곳은 안심하고 배포를 할수 있습니다.

 

그렇게 자신이 만든 기능을 코드공개 없이 배포를 하려면 라이브러리 형식으로 배포를 하면 됩니다.

 

리눅스에서는 라이브러리가 정적과 동적 두가지 형태로 배포할수 있습니다.

 

우선은 정적 라이브러리를 생성하는 방법에 대해서 포스팅을 하려고 합니다.

 

 

정적라이브러리를 배포하기 위해서는 라이브러리용 소스코드가 있어야 합니다.

 

헤더파일과 소스구현 파일이 있어야 하므로 두가지 코드를 작성해주시기 바랍니다. 

 

 

1. static_lib_test.h

#include <stdio.h>   //함수 내부에 출력이 포함되어 있기에 include 해야합니다.

char* ReturnTestPirnt();

void PrintTest();

 

2. static_lib_test.c

#include "static_lib_test.h" // 1. 에서 만들어 놓은 헤더파일을 include 합니다.

char* ReturnTestPirnt(){
	return "Hello Mablang! (ReturnTestPirnt())";
}

void PrintTest(){
	printf("Hello Mablang! (PrintTest())\n");
}

 

이렇게 두 개의 파일을 만들었으면 정적 라이브러리를 만들수 있습니다.

 

라이브러리를 만들기 전에 목적파일( 확장자 : .o )를 먼저 생성이 되야하므로 다음과 같이 명령어를 입력합니다.

 

gcc -c static_lib_test.c

 

명령어를 입력하면 확장자 .o인 목적파일이 생성된것을 볼수 있습니다.

 

 

목적파일이 생성 되었으면 이제 라이브러리를 만들수 있습니다. 

 

정적 라이브러리를 만드는 명령어는 다음과 같습니다. 

 

ar rc lib[라이브러리명칭].a [목적파일]

 

위에 생성해놓은 목적파일을 적용하여 명령어를 만들어 보겠습니다.

 

ar rc libTest.a static_lib_test.o

 

정적 라이브러리 앞에는 항상 lib을 붙여줘야 한다는 것을 잊지 마시기 바랍니다.

 

 

이제 생성된 라이브러리를 사용해보도록 하겠습니다. 예제 코드는 다음과 같습니다.

 

3. StaticLibTester.c

#include "static_lib_test.h" //정적 라이브러리 헤더파일 
#include <stdio.h>
#include <string.h>

void main()
{
	printf("========Static Library Start!!========\n");

    	printf("%s\n", ReturnTestPirnt()); //정적 라이브러리 함수1

	PrintTest(); //정적 라이브러리 함수2

	printf("========Static Library End!!========\n");
	
}

 

정적 라이브러리는 컴파일을 할때 헤더 파일을 include 해줘야 하기 때문에 첫줄에 헤더파일이 include가 되어있습니다. 

 

그럼 명령어를 이용하여 컴파일을 해보겠습니다.

 

gcc -o Tester [사용할 C파일] -L [라이브러리 경로] -l[라이브러리명]

 

 

-L옵션 뒤에는 라이브러리의 경로가 들어갑니다. 그리고 -l 옵션에는 사용할 라이브러리가 들어가는데 lib과 확장자 .a를 제외하고 입력을 해주셔야 합니다. 

 

그럼 컴파일을 해보겠습니다. 

 

gcc -o Tester StaticLiStaticLibTester.c -L ./ -lTest

 

실행파일을 실행해보면 잘 실행되는 것이 보입니다.

 

그럼 이 실행파일만 다른 폴더로 옮긴 뒤에 실행을 해보겠습니다.

 

잘 실행이 되는 군요

 

약간의 실험을 위해 라이브러리만 이용하여 컴파일을 해보겠습니다.

 

컴파일 자체가 되지 않습니다.

 

그럼 소스코드에서 헤더파일을 제외 하고 컴파일 해보겠습니다.

 

컴파일은 되지만 실행했을 때 오류가 발생하는 군요...

 

이렇듯 정적라이브러리는 베포할때 헤더파일과 같이 배포가 되어야하고 사용하는 코드에서 헤더파일을 include 해줘야 합니다.

 

 

여러 프로세스에서 사용하는 함수를 정적 라이브러리로 만들어서 사용하면 코드의 모듈화도 이루어지고 생산성도 빨라지므로 잘 익혀두면 좋을듯합니다.

 

이상 마블랑이었습니다.

 

읽어주셔서 고맙습니다.

 

 

 

댓글