정적 라이브러리

이형래·2020년 10월 20일
4

42seoul

목록 보기
3/4

정적 라이브러리

확장자별 라이브러리 종류
1) .a : 리눅스 / 정적 라이브러리
2) .so : 리눅스 / 동적 라이브러리
3) .lib: 윈도우 / 정적 라이브러리
4) .dll: 윈도우 / 동적 라이브러리

이 글에서는 "*.a" 에 대한 내용을 작성한다.

1. 정적 라이브러리

  • 컴파일된 오브젝트 파일(.o)들이 하나의 파일로 묶여있는 형태.
  • 동적 라이브러리에 비해 실행속도가 빠름.
  • 해당 라이브러리를 필요로 하는 모든 경우에 같은 정적 라이브러리가 링크되기 때문에 배포 파일의 사이즈가 커짐.
  • 대부분 동적 라이브러리를 사용.

2. 정적 라이브러리? || 동적 라이브러리?

정적 라이브러리는 실행 파일에 완전히 포함되어 버리고,
동적 라이브러리는 실행 될 때 해당 라이브러리를 불러오는 형식.

3. 정적 라이브러리 생성 과정

  • 정적 라이브러리는 gcc에서 -c옵션을 사용하여 프로그램을 컴파일 할 때 정적으로 링크된다. 따라서 라이브러리에 변경 사항이 있을 시 코드를 다시 컴파일하고 빌드 해야 함.

% gcc -c util1.c util2.c
: .c 파일을 컴파일
% ls
util1.c util1.o util2.c util2.o
: .o 파일 생성
% ar rscv libmyutil.a util1.o util2.o
: .o 파일을 합치기
% ls
libmyutil.a util1.c util1.o util2.c util2.o
: libmyutil.a 의 정적 라이브러리 생성

4. 몇가지 간단한 ar command 옵션

ar rscv [LIB_NAME][OBJS] : 새로운 정적 라이브러리 생성
ar rus [LIB_NAME][OBJS] : 기존 정적 라이브러리에 새로운 오브젝트 파일 추가
ar ds [LIB_NAME][OBJS] : 기존 정적 라이브러리에서 오브젝트 파일 제거
ar x [LIB_NAME] (([OBJS]): 정적 라이브러리에서 (해당)오브젝트 파일 추출
ar t [LIB_NAME] : 정적 라이브러리에 있는 파일 리스트 출력

5. 생성한 정적 라이브러리 사용

현재 위의 명령으로 libmyutil.a 라이브러리가 생성된 상태라고 하자.
이때 우린 main.c 함수에서 libmyutil.a 라이브러리 내의 함수를 사용했다.
그러므로 libmyutil.a 라이브러리를 링크하여 실행파일을 만들어야 하는 상황.

%gcc -o main.o -c main.c -I [libmyutil.a에서 사용한 함수의 헤더경로]

설명 : main.c 함수를 재료로 삼아 필요 headeer의 경로를 참조하여(대문자 i 옵션) main.o의 이름으로 컴파일. main.o가 만들어 짐.

%gcc -o myproject main.o -L [libmyutil.a 파일의 경로] -l myutil

설명 : main.o를 재료로 삼아 해당 라이브러리 경로에 있는(-L) 해당 라이브러리를 링크하여(-l) 실행파일 생성.
myproject(실행파일) 이 만들어짐.

!!!주의!!!
-l 옵션 사용시 앞의 lib와 뒤의 .a는 생략.

profile
프론트엔드 개발자 입니다. 최근에는 Flutter를 이용한 크로스 플랫폼 앱 개발에 관심이 많습니다.

0개의 댓글