본문 바로가기

C++/g++

정적 라이브러리 빌드

[1. 개요]

여러개의 소스코드로 이루어진 라이브러리를 정적라이브러리로 빌드 후, 

main() 함수가 정의 된 소스코드와 같이 컴파일 하는 과정 정리한다.

 

CMake 형태의 C++ 프로젝트의 경우 

cmake => make 로 컴파일을 쉽게 할 수 있지만,

 

새로운 라이브러리를 테스트 해야 하는 경우, 별도의 cmake 를 작성하는 것이 다소 부담스러울 수 있다.

 

이 경우, gcc(혹은 g++) 와 ar 을 이용하여 라이브러리 빌드 후,

main() 과 링킹하여 간단하게 테스트 프로그램을 만들 수 있다.


[2. 기본 개념]

정적 라이브러리 빌드는 보통 아래 과정을 거친다.

  1. 소스코드에 대해서 object 파일 생성
  2. 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. 참조]

https://testkernelv2.tistory.com/124

'C++ > g++' 카테고리의 다른 글

정적 라이브러리 생성 및 링킹..  (0) 2024.10.15
컴파일 링커 옵션  (0) 2023.04.17