Header : include하여 사용하는 라이브러리
Static Library : 빌드 프로세스에서 linker 가 연결해주는 라이브러리
(.lib, .a)
윈도우에서 라이브러리 파일의 확장자는 .lib이지만
리눅스에서는 .a 확장자를 지닌다.
Dynamic Library
(.dll, .so)
생성 과정은 링커가 실행 파일을 만들기 전에 오브젝트 파일들을 묶어서 링크(안쓰는 섹션 걸러내기) 되기 전 상태인 아카이브 파일을 만드는데
이 파일이 바로 Static Library(.lib || .a) 파일이다.
아카이브(라이브러리) 파일 vs 실행 파일
링크 되기 전(재배치 되기 전) 상태로 놔둔 오브젝트 파일들을 묶어 아카이브 파일을 만들면 이 파일이 Static Library가 되고,
링커가 재배치 한 오브젝트 파일 묶음은 실행 파일(.exe)이 된다.
즉, 오브젝트 파일 묶음의 재배치(링킹) 유무에 따라 라이브러리 또는 실행 파일이 된다.
스태틱 라이브러리 역시 링크(사용) 하려면 스태틱 라이브러리의 실제로 쓰이는 섹션만 가져와서 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 실행 파일이 생성된다.
결론적으로 스태틱 라이브러리는 오브젝트 파일들을 모은 하나의 파일이며
사용법은 빌드 시에 라이브러리 파일을 링킹(연결)하여 실행파일을 만들어 사용한다.
다음에 알아보자 ㅎㅎ
좋은 자료 감사합니다 ^^