오늘은 맑음

정적 라이브러리 본문

Linux

정적 라이브러리

자전거 타는 구구 2017. 12. 8. 11:35
반응형

정적 라이브러리란?

  • 프로그램 작성시 수행파일 안으로 들어가는 오브젝트 모듈들의 모음이라고 할 수 있다. 
  • 소스를 공개하지 않고 함수를 지원할 수 있다.
  • 프로그램의 이름은 lib로 시작되야 하며 확장자는 .a이다.
정적라이브러리 생성

hello.c : hello world를 출력하는 함수를 갖고있는 파일
bye.c : goodbye world를 출력하는 함수를 갖고있는 파일
greeting.h : hello.c와 bye.c에 들어있는 함수를 갖고있는 헤더
main.c : hello.c와 bye.c를 호출하는 함수

  • makefile을 사용하지 않은 라이브러리 생성
gcc -c hello.c  (결과물로 hello.o 오브젝트 파일이 생성된다.)
gcc -c bye.c (결과물로 bye.o 오브젝트 파일이 생성된다.)
ar rcv libgreeting.a hello.o bye.o (결과물로 libgreeting.a파일이 생성된다.)
gcc main.c libgreeting.a (이름을 따로 설정해주지 않아 a.out파일이 생성된다)

a.out파일을 생성하면 hello world와 goodbye world가 출력 되는 것을 볼 수 있다.

  •  makefile을 사용하고 링크를 사용하지 않고 라이브러리 생성하기
greeting : main.c libgreeting.a
gcc -o greeting main.c libgreeting.a

libgreeting.a : hello.o bye.o
ar rcv libgreeting.a hello.o bye.o

bye.o : bye.c greeting.h
gcc -c bye.c

hello.o : hello.c greeting.h
gcc -c hello.c

makefile을 만들어주어 스크립트형식으로 적어준 뒤 make명령어를 수행하면 greeting이라는 실행파일이 만들어 진 것을 볼 수 있을 것이다. 
greeting을 실행시켜보자.

  • makefile을 사용하고 링크를 사용하여 라이브러리 생성하기
greeting : main.o libgreeting.a
gcc -o greeting main.o -L./ -lgreeting

libgreeting.a : hello.o bye.o
ar rcv libgreeting.a hello.o bye.o

main.o : main.o greeting.h
gcc -c main.c

bye.o : bye.c greeting.h
gcc -c bye.c

hello.o : hello.c greeting.h
gcc -c hello.c

 역시 위와 같이 makefile을 만들어 주면 두번째 방법과 똑같은 greeting파일이 생성되게 된다
 makefile을 만들어 줄 때 hello.o 뒤에 hello.c greeting.h를 기입해주면 hello.c와 greeting.h가 hello.o보다 늦게 만들어지거나 수정되었을 시에 아래에 있는 명령어를 실행시켜준다는 의미이다. 
 이를 통해 makefile을 사용 할 때 수정되지 않은 파일에 대해서 불필요한 명령어 수행을 줄일 수 있다.


 gcc 옵션

의미

 -c

오브젝트 파일을 생성한다. default : a.out

-o 

-o 다음에 적어준 이름의 파일로 생성한다 

-l 

라이브러리를 지정해준다

-L  

라이브러리 폴더를 찾아서 지정한다 

위에서는 -L./을 사용. 현재 디렉토리 의미

 -Wall

모호한 코딩에 대하여 경고메세지를 출력한다 

 -static

정적 라이브러리와 링크한다 

-shared 

가능한 공유 라이브러리와 링크한다 

 

 


정적라이브러리의 장점 

 : 동작을 위한 모든 코드가 실행 바이너리 안에 포함되기 때문에 별도의 작업없이 라이브러리 함수들을 사용할 수 있다.

정적 라이브러리의 단점 

: 라이브러리 함수들을 사용하는 프로그램이 많아질수록 실행파일의 크기가 커진다. 또한 메모리 공간효율이 떨어진다.



반응형

'Linux' 카테고리의 다른 글

vim 상하 좌우 분할  (0) 2019.10.18
[Linux] makefile 사용해서 compile하기  (0) 2019.03.13
linux 정적 라이브러리 사용  (0) 2019.03.12
[Linux] linux에서 gcc(c/c++) compile하기  (0) 2019.03.12
linux 공유 라이브러리  (0) 2017.12.08
Comments