라이브러리

mtak·2021년 1월 26일
0

42Seoul

목록 보기
6/13

0. 라이브러리 종류

  1. Header : include하여 사용하는 라이브러리

  2. Static Library : 빌드 프로세스에서 linker 가 연결해주는 라이브러리

    (.lib, .a)

    윈도우에서 라이브러리 파일의 확장자는 .lib이지만

    리눅스에서는 .a 확장자를 지닌다.

  3. Dynamic Library
    (.dll, .so)

    1. load time : 프로세스가 처음 실행될 때 로더가 바인딩시켜주는 라이브러리
    2. run time : 프로세스가 한참 실행 중에 필요할 때 라이브러리를 바인딩시켜주는 개념

1. Static Library 생성 & 링킹

​ 생성 과정은 링커가 실행 파일을 만들기 전에 오브젝트 파일들을 묶어서 링크(안쓰는 섹션 걸러내기) 되기 전 상태인 아카이브 파일을 만드는데
이 파일이 바로 Static Library(.lib || .a) 파일이다.

아카이브(라이브러리) 파일 vs 실행 파일

링크 되기 전(재배치 되기 전) 상태로 놔둔 오브젝트 파일들을 묶어 아카이브 파일을 만들면 이 파일이 Static Library가 되고,
링커가 재배치 한 오브젝트 파일 묶음은 실행 파일(.exe)이 된다.

  1. 즉, 오브젝트 파일 묶음의 재배치(링킹) 유무에 따라 라이브러리 또는 실행 파일이 된다.

  2. 스태틱 라이브러리 역시 링크(사용) 하려면 스태틱 라이브러리의 실제로 쓰이는 섹션만 가져와서 relocation(재배치)하여 오브젝트 파일과 결합해 실행 파일을 만든다.

cat.o 오브젝트 파일(cat.cpp + cat.h)을 라이브러리 파일로 만들려면
소스 파일을 목적 파일로 complie한 후

gcc -c cat.c

명령창에

ar -rs libcat.a cat.o

을 입력하면 libcat.a 스태틱 라이브러리 파일을 만들 수 있다.

r : 지정한 아카이브로 모듈(obj파일) 추가. 새로운 obj파일이면 추가, 기존 파일이면 치환.

c : 아카이브 (라이브러리 파일) 생성.

s : 아카이브 인덱스를 생성.

그리고 이 스태틱 라이브러리(libcat.a)를 링킹하여 main.c을 빌드할려면

gcc main.c -L. -lcat

🌈-l 옵션

  • 링크할 라이브러리를 명시하는 옵션이다.
  • 정적 라이브러리를 링크시키는데 사용되며 대상 라이브러리 파일의 이름에서 앞의 lib와 뒤의 .a를 떼고 인식한다.
  • 예를 들어 libft.a 라이브러리 파일을 링크시키려면 -lft 로 옵션을 주면 된다.

그렇다면 컴파일러가 라이브러리를 찾을 수 있도록 검색할 위치를 명시해 주는 작업도 필요할 것이다. 기본적으로 리눅스는 /lib, /usr/lib, /usr/local/lib 만을 검색해서 라이브러리를 찾는다. 그러므로 추가적으로 디렉토리를 검색하도록 하려면 아래의 -L 옵션을 사용하면 된다.

🌈-L 옵션

  • 라이브러리 위치를 정해주는 옵션이다.

  • 사용은 다음과 같이 -L<디렉토리명> 으로 한다.

      $ ar rcs libftprintf.a libftprintf.o -L./libft -lft

을 명령창에 입력하여 a.out 실행 파일이 생성된다.

결론적으로 스태틱 라이브러리는 오브젝트 파일들을 모은 하나의 파일이며
사용법은 빌드 시에 라이브러리 파일을 링킹(연결)하여 실행파일을 만들어 사용한다.

2. Dynamic Library 생성 & 링킹

다음에 알아보자 ㅎㅎ

ref

profile
노는게 젤 조아. 친구들 모여라!!

1개의 댓글

comment-user-thumbnail
2021년 5월 7일

좋은 자료 감사합니다 ^^

답글 달기