[1. 개요]
여러개의 소스코드로 이루어진 라이브러리를 정적라이브러리로 빌드 후,
main() 함수가 정의 된 소스코드와 같이 컴파일 하는 과정 정리한다.
CMake 형태의 C++ 프로젝트의 경우
cmake => make 로 컴파일을 쉽게 할 수 있지만,
새로운 라이브러리를 테스트 해야 하는 경우, 별도의 cmake 를 작성하는 것이 다소 부담스러울 수 있다.
이 경우, gcc(혹은 g++) 와 ar 을 이용하여 라이브러리 빌드 후,
main() 과 링킹하여 간단하게 테스트 프로그램을 만들 수 있다.
[2. 기본 개념]
정적 라이브러리 빌드는 보통 아래 과정을 거친다.
- 소스코드에 대해서 object 파일 생성
- object 파일을 하나의 archive 파일로 묶는다.
1번 과정에서 gcc (g++) 를 사용하고,
2번 과정에서 ar 을 사용한다.
[3. 예제]
여기서는 zlib 를 정적라이브러리로 빌드 하고,
라이브러리 기능을 사용하는 소스코드 작성 및 컴파일 과정까지 정리하도록 한다.
zlib 의 소스코드는 아래 링크에서 다운 받을 수 있다.
압축 해제 후, 헤더파일과 소스코드만 별도의 폴더에 저장한다.
디렉터리 구조가 아래와 같이 구성한다.
- include\
- zlib.h, ...
- main.cpp
include 디렉터리로 이동 후 아래 명령어를 실행한다.
- $ gcc -c *.c
# 현재 디렉터리에서 모든 c 파일에 대해서 object 파일을 생성한다.
# Compile and assemble, but do not link.
그러면 .o 를 확장자로 하는 파일들이 생성된다.
이제 archive 파일을 만들도록 한다.
- ar -rc libz.a *.o
# 모든 object 파일을 묶어서, libz.a (정적라이브러리) 를 생성한다.
마지막으로 zlib 라이브러리를 이용하는 main 함수가 있는 코드를 작성한다.
컴파일은 아래 명령어를 이용하여 진행하도록 한다.
- g++ main.cpp -Linclude -Iinclude -lz
# -L 은 라이브러리를 찾을 디렉터리를 명시하도록 한다.
# -I (대문자 i) 는 추가 헤더파일을 찾을 디렉터리를 명시하도록 한다.
# -l (소문자 L) 은 사용할 라이브러리를 명시한다.
=> libz.a 인 경우 lib 와 .a 를 제외하도록 한다.
[4. 참조]
'C++ > g++' 카테고리의 다른 글
정적 라이브러리 생성 및 링킹.. (0) | 2024.10.15 |
---|---|
컴파일 링커 옵션 (0) | 2023.04.17 |