라이브러리 만들기

jujeon·2021년 9월 28일
1

42서울 라피신

목록 보기
1/1

목차

  1. 라이브러리함수
  2. 컴파일이란?
      1. 소스파일 컴파일러 링커
      1. 목적파일 .obj를 만드는 이유
      1. 링크와 링커 프로그램
  3. 정적라이브러리 동적라이브러리
      1. 라이브러리란?
      1. 정적 vs 동적
      1. 라이브러리 파일 만들기 (ar)

1. 라이브러리함수 library function

라이브러리함수 : 미리 구현된 함수들 printf, scanf 등

2. 컴파일이란?

1. 소스파일 컴파일러 링커

소스파일을 짠다 : 편집기라고 부르는 에디터를 사용해서 C 언어 등의 약속에 맞게 짠다. 이 문서파일을 원시파일 또는 소스파일이라고 말하고 에디터를 이용해서 문법에 맞도록 작문하는걸 프로그램을 짠다고 한다.

소스파일을 컴파일러 프로그램을 이용해 기계어파일로 변환 : 소스파일을 컴파일러라는 프로그램을 이용해 컴파일 합니다. 컴파일compile 은 번역한다는 뜻이고 컴파일은 번역기에 해당합니다. 사람들이 알아볼 수 잇는 소스파일을 기계가 알아볼 수 있는 기계어파일로 번역합니다.

컴파일과정을 통해 만들어진 목적파일들을 링커를 이용해 연결합니다. : 컴파일러라는 프로그램으로 소스파일을 컴파일하면 목적파일 또는 중간파일이라는 .OBJ 파일이 생성됩니다. 이렇게 생성된 목적파일을 링커라는 프로그램을 이용해서 연결시킵니다.
링커를 이용해서 목적파일을 연결시키면 마침내 실행파일인
.COM 또는 *.EXE 파일이 하나 만들어집니다. 이 파일은 실행이 되는 프로그램입니다.

2. 목적파일 .obj를 만드는이유

이유 1 : 소스파일의 보안을 유지하면서 기능만 제공
이유 2 : 분업화 모듈화 가능
이유 3 : 컴파일 시간 등을 줄일 수 있습니다.
이유 4 : 확장성과 이식성을 높일 수 있다.

obj파일을 이용하면 하나의 프로그램을 짤 때 열 명이 각기 다른 기능을 가진 프로그램을 짜도 됩니다. (가)는 시계프로그램을 짜고, (나)는 달력프로그램을 (다)는 문서편집프로그램을 짠 뒤에 각기 짠 프로그램을 *.obj 파일로 만들어서 총기획자에게 보내주면 작업이 끝납니다. 프로그램 기획자는 (가) (나) (다)로부터 받은 세 개의 파일을 링크프로그램으로 연결만 하면 되기 때문입니다.
또한 프로그램을 만드는 실무자들은 자신이 맡은 부분만 담당하게 되므로 프로그램 전체의 기밀을 유지하는데도 도움이 됩니다.

3. 링크와 링커프로그램

링크 : 목적파일을 연결해 실행파일로 만드는 일
링커 : 링크작업을 해주는 프로그램

중간중간 소스파일을 컴파일해서 *.obj 파일로 만들어주는 프로그램을 컴파일러(번역기)라 하고, 목적 파일로 만드는 과정을 '컴파일한다'고 표현합니다. 그리고 중간 목적파일인 obj 파일을 연결해서 최종적으로 하나의 실행파일로 만들어주는 프로그램을 링커(Linker)라고 하고, 실행파일로 만드는 과정을 '링크시킨다(Linking)'라고 말합니다. 이렇게 obj 파일을 링커 프로그램으로 링크시키면 비로소 실행파일이 만들어지는 것입니다.

참조 : http://ith.kr/chair/cpp/cpp103.html

4. gcc -c command

  • gcc -c -Wall -Wextra -Werror [filename] : create obj file
gcc -c [obj file name file] [name(*.c)]
gcc -c [name(*.c)]
  • Wall : 모든 모호한 코딩에 대해서 경고를 보내는 옵션
  • Wextra : Wall에 의해 활성화되지 않는 추가적인 Warning flags를 활성화합니다.
  • Werror : 모든 경고를 컴파일을 중단하는 에러로 취급해서 경고 하나만 나와도 컴파일 중단.
  • c : as에 의한 어셈블까지만 수행하고 링크는 수행하지 않는다.

3. 정적라이브러리 동적라이브러리

1. 라이브러리란?

라이브러리는 다른 프로그램들과 링크되기 위해 존재하는, 하나이상의 서브루틴(subroutine)이나 함수(function)들의 집합파일이다.
링크될 수 있도록 보통 컴파일된 형태인 목적코드object code형태로 존재한다.
미리 컴파일 되어있어 컴파일 시간도 단축된다.

-> 서브루틴 : C언어는 서브루틴과 함수를 구분하지 않는다. 하지만 일부 언어에서는 함수의 반환값이 없는경우를 서브루틴 잇는경우를 함수로 정의한다.

2. 정적 vs 동적

정적라이브러리 : 프로그램을 컴파일하는 과정에서 포함시키는 오브젝트 파일들의 모임
동적라이브러리 : 완성된 프로그램을 실행할 때 포함시키는 동적 라이브러리

확장자별 라이브러리 구분

.a : 리눅스 / 정적
.so : 리눅스 / 동적
.lib : 윈도우 / 정적
.dll : 윈도우 / 동적

정적 라이브러리 (Static Library) 또는 아카이브(Archive)
: 컴파일러가 소스파일을 컴파일할 때 참조되는 프로그램 모듈. 즉, 정적 라이브러리는 (statically-linked library) 루틴 외부함수와 변수들의 집합으로, 컴파일러, 링커, 바인더 등에 목표된 애플리케이션으로 복사돼 오브젝트 파일과 독립적으로 실행할 수 있는 실행파일을 생성하는데 사용된다.
윈도의 .LIB파일과 같이 .a확장자를 갖고있따.

장점

  • 시스템 환경이 변해도 애플리케이션에 아무런 영향이 없고, 완성된 애플리케이션을 안정적으로 사용할 수 있다.
  • 컴파일시 필요한 라이브러리를 프로그램 내에 적재하기 때문에 이식성이 좋다.
  • 런타임시 외부를 참조할 필요가 없기 때문에 속도에서 장점이 있다.

단점

  • 같은 코드를 가진 여러 프로그램을 실행할 경우 코드가 중복이 되니 그만큼 메모리를 낭비하게 된다.
  • 라이브러리 변경이 필요할 시, 변경된 라이브러리만 재배포하면 안되고 프로그램을 다시 재배포 해야 한다.

동적라이브러리(Dynamin Library)
-> 지금 안쓰는 듯 나중에

3. 라이브러리 파일 만들기 (ar)

libft 프로젝트에 만들어야 하는 건 정적라이브러리다
정적라이브러리는 컴파일된 오브젝트 파일들이 하나의 아카이브로 묶여잇는 형태로, 오브젝트 파일들을 묶어주는 명령어가 ar 명령어다.
-> 정적라이브러리 ok, 아카이브 ok, ar?

(사용 예)

ar rscv libft.a file1.o file2.o

사실 ar 명령어는 정적 라이브러리에 국한되지 않고, 범용적인 비압축 아카이브로 사용할 수 있으나 일반적으로는 정적 라이브러리를 다루기 위해 사용된다고 한다!

생성된 오브젝트 파일을 이용하여 라이브러리를 만들도록 한다. 이때 사용하는 커맨드는 ar로 라이브러리 작성에 사용됨.

4. ar option

<아카이브 생성>
r : 새로운 오브젝트 파일이면 추가, 기존 파일이면 치환
c : 아카이브(라이브러리 파일) 생성, 존재하지 않는 아카이브를 작성(또는 갱신)하는 경우에도 경고 메시지를 출력하지 않음
u : 오브젝트 파일의 타임스탬프를 비교해 새로운 파일일 경우에만 치환
s : ranlib(1)과 마찬가지로 아카이브 인덱스 생성. 아카이브 인덱스를 생성하지 않으면 링크 속도가 느려지고, 시스템 환경에 따라 에러가 발생할 수도 있음

<기존 아카이브 파일에서 오브젝트 파일 제거>

ar ds [라이브러리 이름] [오브젝트 파일들]

d : 아카이브 모듈을 삭제, 삭제할 파일이 없다면 동작하지 않음

<아카이브 내용 조회>

ar tv [라이브러리 이름]

t : 아카이브에 있는 파일 리스트 출력
v : 자세한 내용을 보여주는 verbose 모드로, 이 옵션을 이용하면 파일 크기나 갱신 시각 등의 상세 정보도 출력

<아카이브에서 파일 추출>

ar xv [라이브러리 이름]

x : 아카이브에서 오브젝트 파일 추출
v : 추출한 파일의 파일명 출력

profile
개발과 학습방법에 대한 고민과 노력의 흔적들이 채워지는 블로그 입니다!

4개의 댓글

comment-user-thumbnail
2021년 9월 28일

도움 많이 됐습니다ㅎㅎ! 감사합니다~

답글 달기
comment-user-thumbnail
2021년 9월 28일

피신할때 많은 도움이될거같네요 ㅎㅎ^^

1개의 답글
comment-user-thumbnail
2021년 10월 9일

와 뜻밖에 dll이 뭔지 알아갑니다 감사합니다

답글 달기