외부 라이브러리란?

외부 라이브러리는 프로젝트에서 직접 작성하지 않은, 외부에서 제공된 코드나 라이브러리를 의미한다. 이러한 라이브러리는 다른 개발자들이 미리 작성해 놓은 코드로, 특정 기능을 수행하거나 알고리즘을 구현할 때 사용할 수 있다. CMake를 사용하여 프로젝트에 외부 라이브러리를 추가하면, 복잡한 빌드 시스템을 간편하게 관리할 수 있다.

CMakeLists.txt 파일의 구조

CMakeLists.txt 파일은 CMake를 사용하여 프로젝트를 구성할 때 필요한 설정 정보를 담고 있다. 이 파일은 프로젝트의 이름, 버전, 필요한 소스 파일, 그리고 라이브러리와의 연결 정보를 포함한다. 기본적인 CMakeLists.txt 파일의 구조는 다음과 같다:

cmake_minimum_required(VERSION 3.x)
project(ProjectName)

add_executable(ProjectName main.cpp)

find_package(LibraryName REQUIRED)
target_link_libraries(ProjectName PRIVATE LibraryName)

find_package() 명령어

find_package()는 CMake에서 외부 라이브러리를 찾기 위해 사용되는 명령어이다. 이 명령어는 CMake가 설정된 경로에서 특정 라이브러리를 찾고, 해당 라이브러리가 존재하면 CMakeLists.txt 파일에 사용할 수 있는 변수를 설정한다. REQUIRED 옵션을 추가하면, 라이브러리를 찾지 못할 경우 에러를 발생시킨다.

예를 들어, Boost 라이브러리를 사용하려면 다음과 같이 작성할 수 있다:

find_package(Boost REQUIRED)

CMake는 Boost 라이브러리를 시스템에서 찾고, 관련 변수들을 설정한다.

target_link_libraries()는 컴파일된 바이너리에 라이브러리를 연결하는 명령어이다. 이 명령어는 프로젝트가 특정 라이브러리에 의존성을 가지도록 만든다. 이 명령어에는 세 가지 주요 접근 방법이 있다: PRIVATE, PUBLIC, INTERFACE.

예를 들어, Boost 라이브러리를 PRIVATE로 연결하려면 다음과 같이 작성할 수 있다:

target_link_libraries(ProjectName PRIVATE Boost::boost)

이 경우 Boost::boostBoost 라이브러리의 CMake에서 제공하는 임포트된 타겟 이름이다.

include_directories() 명령어

include_directories()는 프로젝트에서 사용할 헤더 파일의 디렉토리를 추가하는 명령어이다. 외부 라이브러리를 사용할 때, 해당 라이브러리의 헤더 파일이 있는 디렉토리를 명시해야 한다.

include_directories(${Boost_INCLUDE_DIRS})

위의 코드에서 ${Boost_INCLUDE_DIRS}find_package()에 의해 설정된 변수로, Boost 라이브러리의 헤더 파일이 있는 디렉토리를 가리킨다.

외부 라이브러리의 설치 경로 지정

경우에 따라 CMake가 외부 라이브러리를 찾지 못할 수 있다. 이때 CMAKE_PREFIX_PATH 변수를 사용하여 라이브러리가 설치된 경로를 명시할 수 있다.

set(CMAKE_PREFIX_PATH "/path/to/library")
find_package(LibraryName REQUIRED)

이 명령어는 CMake에게 /path/to/library 경로에서 라이브러리를 찾도록 지시한다.

외부 라이브러리를 직접 포함하기

때로는 외부 라이브러리를 CMake의 find_package()를 통해 찾는 대신, 직접 소스 코드나 바이너리를 포함할 수도 있다. 이 경우에는 add_subdirectory() 명령어를 사용하여 라이브러리를 포함할 수 있다.

add_subdirectory(/path/to/library)
target_link_libraries(ProjectName PRIVATE LibraryName)

이 방법은 주로 라이브러리의 소스 코드가 프로젝트와 함께 제공되는 경우에 사용된다.

빌드 옵션과 외부 라이브러리

일부 라이브러리는 특정 빌드 옵션을 필요로 할 수 있다. 예를 들어, Boost는 특정 컴파일러 플래그를 필요로 할 수 있다. 이런 경우, target_compile_options() 명령어를 사용하여 필요한 옵션을 설정할 수 있다.

target_compile_options(ProjectName PRIVATE ${Boost_COMPILE_OPTIONS})

이 명령어는 프로젝트가 컴파일될 때 필요한 컴파일러 옵션을 추가한다.

외부 라이브러리의 설치

프로젝트에 외부 라이브러리를 포함하기 위해서는 먼저 해당 라이브러리가 시스템에 설치되어 있어야 한다. 패키지 매니저(예: apt, brew)를 사용하거나, 직접 소스 코드를 다운로드하여 빌드한 후 설치할 수 있다. 설치 경로를 CMake에서 참조할 수 있도록 설정하는 것이 중요하다.


관련 자료: - https://cmake.org/cmake/help/latest/command/find_package.html - https://cmake.org/cmake/help/latest/command/target_link_libraries.html - https://cmake.org/cmake/help/latest/command/include_directories.html