(CMake 튜토리얼) 1. 라이브러리 사용하기 w/ pkg-config

 

pkg-config와 cmake에 대해 서술하는 글입니다.


이전까지 프로그램을 실행하고 디버깅하는 방법에 대해서 알아보았다. 개발을 하면서 boost, eigen, opencv, sdl 등등 여러 라이브러리들을 써야하는데, 오늘은 CMake로 라이브러를 추가하는 것에 대해 알아보겠다.

SDL2 설치

나는 맥이기 때문에 brew로 설치하겠다. brew instal sdl2로 SDL을 설치한다. SDL은 C로 짜여진 크로스플랫폼 멀티미디어 라이브러리이다.

라이브러리 사용하기

SDL을 추가한 새 cmakelists.txt를 보자.

CMAKE_MINIMUM_REQUIRED (VERSION 3.15 )

# project setting
SET ( PROJ_NAME cmake-test )
PROJECT ( ${PROJ_NAME} )
SET( EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR} )

# C++ settings
SET(CMAKE_CXX_STANDARD 11)

# Add SDL2 library 
FIND_PACKAGE(SDL2 REQUIRED)
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS})

# set source and headers
SET (SRC_FILES
    src/main.cpp
)

# build 
ADD_EXECUTABLE( ${PROJ_NAME} ${SRC_FILES} )
TARGET_LINK_LIBRARIES( ${PROJ_NAME} ${SDL2_LIBRARIES} )

달라진 점은 12, 13, 22번째 줄이다. 라이브러리를 사용하면서 여러 함수들을 사용했다.

FIND_PACKAGE

라이브러리 이름(lib_name)이 SDL2라고 하자.

FIND_PACKAGE(${lib_name} REQUIRED)로 cmake가 현재설치된 라이브러리를 알아서 찾아, 추가를 해준다.

  • 아마 VS 였으면, 추가포함디렉토리, 추가라이브러리디렉토리를 일일이 다 넣어줬겠지….
  • 여기서 REQUIRED는 라이브러리를 못찾을 경우 에러를 발생시키는 옵션이다.

FIND_PACKAGE를 사용하면 package를 찾긴 했지만 실질적으로 lib를 추가하고, include를 하는등 실질적인 라이브러리 추가 작업은 하지 않았다.

위의 추가작업은 INCLUDE_DIRECTORIES(${lib_name+INCLUDE_DIRS})TARGET_LINK_LIBRARIES( ${PROJ_NAME} ${lib_name+LIBRARIES} )로 처리할 수 있다.

그러면 우리는 lib_name만 알면 include주소나 lib주소를 알필요 없이 편하게 라이브러리를 추가하고 설치만 하면되는 것이다.

pkg-config

pkg-config는 라이브러리의 linking interface라고 보면 될 것같다. 여러 프로그램에서 각각 라이브러리를 쓰는데, 설치된 라이브러리의 include path, library path, cflags, version등등을 확인할 수 있도록 규격화한 것 이다.

필자의 경우 Mac OS X 여서 brew install pkg-config로 설치하였고 Linux는 apt로 설치하시고, window의 경우는 잘 모르겠다….

/usr/local/lib/pkgconfig/usr/lib/pkgconfig에서 ls로 설치된 라이브러리의 .pc(pkg-config) 파일을 확인할 수 있다.

.pc 파일 열어보기

현재 sdl2외에는 다른 라이브러리를 설치하지 않았기 때문에 sdl2.pc파일 만 잡힌 모습이다.

> ls /usr/local/lib/pkgconfig
sdl2.pc

cat으로 pc파일을 출력해보면, 관련된 정보를 다 알수있다.

> cat /usr/local/lib/pkgconfig/sdl2.pc
# sdl pkg-config source file

prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: sdl2
Description: Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer.
Version: 2.0.10
Requires:
Conflicts:
Libs: -L${libdir}  -lSDL2
Libs.private: -lSDL2  -lm -liconv  -Wl,-framework,CoreAudio -Wl,-framework,AudioToolbox -Wl,-framework,ForceFeedback -lobjc -Wl,-framework,CoreVideo -Wl,-framework,Cocoa -Wl,-framework,Carbon -Wl,-framework,IOKit -Wl,-weak_framework,QuartzCore -Wl,-weak_framework,Metal
Cflags: -I${includedir}/SDL2  -D_THREAD_SAFE

그래서 실제로 파일이 존재하는지 해당 위치로 가보자. 결론적으로 우리는 pkg-config만 사용하면 편하게 라이브러리를 가져와 cmake에서 사용할 수 있는 것이다.

> ls /usr/local/lib
cmake               libSDL2-2.0.0.dylib libSDL2.a           libSDL2.dylib       libSDL2_test.a      libSDL2main.a       pkgconfig
> ls /usr/local/include 
SDL2