동적라이브러리 충돌문제가 생겨서 라이브러리구조와 만드는 방법에 대해서 공부를 해보게 되었다.
우선 리눅스에서 라이브러리는 다른 프로그램에서 사용 할 수 있도록 미리 만들어진 하나이상의 서브 루틴이나 함수들이 모여있는 파일이다.
라이브러리 종류는 정적 라이브러리(static library=>.a파일)와 공유 라이브러리(shared library=>.so파일)이 있다. 둘다 장단점이 명확하지만 주로 라이브러리는 배포하기 위한 목적성을 갖기 때문에 대부분 .so형태로 만들어서 사용 된다.
간단한 예제를 통해 계산기 기능을 가지고 있는 정적 라이브러리와 동적 라이브러리를 만들어 보자.
<라이브러리를 만들 기 위한 큰그림>
[sum.h]
#ifndef __SUM__H
#define __SUM__H
int sum(int a, int b);
#endif
[sum.c]
#include"sum.h"
#include<stdio.h>
int sum(int a, int b){
printf("This is sum function\n");
return a+b;
}
[sub.h]
#ifndef __SUB__H
#define __SUB__H
int sub(int a, int b);
#endif
[mul.h]
#ifndef __MUL__H
#define __MUL__H
int mul(int a, int b);
#endif
[mul.c]
#include"mul.h"
#include<stdio.h>
int mul(int a, int b){
printf("This is Mul function\n");
return a*b;
}
[div.h]
#ifndef __DIV__H
#define __DIV__H
int div(int a, int b);
#endif
[div.c]
#include"div.h"
#include<stdio.h>
int div(int a, int b){
printf("This is Div Function\n");
if(b==0)
return 0;
return a/b;
}
[main.c]
#include "sum.h"
#include "sub.h"
#include "mul.h"
#include "div.h"
#include<stdio.h>
int main(void){
printf("%d\n",sum(10,10));
printf("%d\n",sub(100,10));
printf("%d\n",mul(10,10));
printf("%d\n",div(10,10));
return 0;
}
이제 재료가 준비가 되었으니 프로그램을 만들어보자.
1.정적 러이브러리
정적 라이브러리는 라이브러리를 사용하는 프로그램과 함께 컴파일 된다. 프로그램의 크기가 커지게 되고 해당 라이브러리를 여러 프로그램에서 사용한다면 각각의 프로그램 마다 자신들의 코드영역에 코드를 넣기 때문에 비효율이 발생한다. 하지만 장점은 이식성이 좋고 속도가 공유 라이브러리에 비해 빠르다.
정적 라이브러리를 만드는 방법
- 오브젝트 파일을 생성
- .a파일 생성(오브젝트 파일들을 하나로 모아서 라이브러리 생성)
ar rc libmycalc.a sum.o sub.o mul.o div.o
- 라이브러리를 링크
gcc -o testStaticCalc main.c -L./ -lmycalc (라이브러리 앞에 lib과 .a는 생략)
- 실행 결과
This is sum function
20
This is sub function
90
This is Mul function
100
This is Div Function
1
2.공유 라이브러리
공유 라이브러리는 사용하고자 하는 프로그램이 메모리에 적재될 때 (실행될때) 함께 메모리에 적재 된다. 만약 다른 프로그램에서 이미 해당 메모리를 사용하고 있다면 적재되지 않고 그대로 사용한다.(효율적) 그러나 필요할때 적재되기 때문에 정적라이브러리에 비해 상대적으로 속도가 느리다.
- 오브젝트 파일 생성
gcc -fPIC -c sum.c sub.c mul.c div.c (정적 라이브러리와는 조금 다르게 -fPIC옵션이 추가 되었다. PIC(position independent code) 동적 라이브러리로 사용하도록 하는 옵션)
- .so파일 생성(오브젝트 파일들을 하나로 모아서 라이브러리 생성)
gcc -shared -o libmysharedcalc.so sum.o sub.o mul.o div.o
- 라이브러리를 링크
gcc -o testSharedCalc main.c -L./ -lmysharedcalc
- 실행 결과
This is sum function
20
This is sub function
90
This is Mul function
100
This is Div Function
1
makefile로 위의 과정을 만들면
[Makefile]
testSharedCalc: main.c main.h libmysharedCalc.so
gcc -o testSharedCalc main.c -L./ -lmysharedCalc
libmysharedCalc.so: sum.o sub.o div.o mul.o
gcc -shared -o libmysharedcalc.so sum.o sub.o mul.o div.o
sum.o: sum.h sum.c
gcc -fPIC -c sum.c
sub.o: sub.h sub.c
gcc -fPIC -c sub.c
div.o: div.h div.c
gcc -fPIC -c div.c
mul.o: mul.h mul.c
gcc -fPIC -c mul.c
clean:
rm -f *.o
rm -f $(TARGET)
참조:https://www.joinc.co.kr/w/Site/C/Documents/CprogramingForLinuxEnv/Ch12_module
http://blog.naver.com/PostView.nhn?blogId=xogml_blog&logNo=130138049704
'리눅스' 카테고리의 다른 글
[glib] 메인루프 (0) | 2018.03.04 |
---|---|
리눅스 signal (0) | 2018.02.17 |
pthread에서 메모리 침범과 pthread_cancel (1) | 2018.01.21 |
Dead lock과 pthread에서 mutex lock하는 방법 (2) | 2018.01.07 |
pthread 사용시 주의할점과 tread detach, join에 관해 (0) | 2017.12.14 |