GCC을 이용한 정적 라이브러리(Static Library)을 만드는 방법을 사용한다.


 정적 라이브러리는 과거 개발자의 편의성을 위해서 작성되었다.

 먼저, 소스를 한 소스에 몰아서 정리하는 것에서 개발자는 차후에 유지 보수하기가 어려워진다는 문제점을 가지고 있게 되었다.

 그래서 필요한 기능만 가지고 있는 장치만 만들고, 이 장치를 호출하는 형태로 관리하는 것이다.

 다시 그 기능을 수정할려면, 그 부분을 수정한 후에 컴파일을 하면 되는 것이다.


 정적 라이브러리가 사용되는 위치는 링크 작업에서 하기 때문에, 소스를 받아서 컴파일하는 것 보다는 상대적으로 처리속도가 빨라진다.


 정적 라이브러리(Static Library)의 단점은 해당 라이브러리의 기능이 약간이라도 변경이 되면, 다시 작업을 해야되는 단점을 가진다.

 이러한 문제는 차후에 개발자의 유지/보수에서 큰 문제를 가지게 되었다.

 하나의 기능을 고치기 위해선 모든 소스를 컴파일 해야되는 문제점을 가지게 되었고, 이것은 곧 하나의 문제를 위해서 프로그램을 모두 다시 제작하는 과정이 있어야된다는 점이다.[각주:1][각주:2]


 정적 라이브러리를 작성할 예제이다.


 math.h

1
2
int sum(intint);
int diff(intint);
cs



 math.c

1
2
3
4
5
6
7
8
9
10
11
#include "math.h"
 
int sum(int a, int b)
{
    return a + b;
}
 
int diff(int a, int b)
{
    return a - b;
}
cs


 이렇게 한 후에 math.a(*.lib)을 작성하는 방법은 다음과 같다.

1
2
gcc -c math.c -o math.o
ar rc libmath.a math.o
cs


 이렇게 하면 libmath.lib이라는 정적 라이브러리 파일이 완성되게 된다.


 libmath.lib을 이용한다.


 사용하기 위한 예제.


 main.c

1
2
3
4
5
6
7
8
9
10
11
12
#include "math.h"
 
int main()
{
    int a = 10;
    int b = 40;
    
    printf("sum : %d\n",sum(a,b));
    printf("diff : %d\n",diff(a,b));
    
    return 0;
}
cs


 이렇게해서 사용을 할 수 있다.


 참고로 math.h에 있는 sum과 diff가 위에는 정의가 되어있지 않기 때문에 원래는 사용을 할 수 없을 것이다.(math.c가 없다고 가정한다.)

 하지만, libmath.a라는 파일이 있다면, 다음과 같은 방법으로 사용할 수 있게 된다.


1
gcc .\main.c -L./ -lmath
cs


 이렇게 하면, 정적 라이브러리를 사용해서 프로그램을 만들 수 있게 된다.'

 여기서 -L은 참조할 Library의 위치를 지정하는 것이고, -l은 lib과 .a을 제외한 라이브러리의 명칭을 뜻한다.

 만약 .lib이라면(libmath.lib), -llibmath 라는 형식을 취해야된다.


 정적 라이브러리를 이용해서 작성한 기능을 불러와서 사용하는 형태를 취하면 분할 컴파일을 할때 조금 더 효율적으로 작성을 할 수 있게 된다.


 참조 : http://www.joinc.co.kr/w/Site/C/Documents/Make_Library

  1. 이런 유연성 부족 문제에 의해서 정적라이브러리를 지양(피하는)한다. [본문으로]
  2. 유연성을 올리기 위해서 동적 라이브러리를 이용한다. [본문으로]
Posted by JunkMam
,