# 외부 라이브러리 추가 방법

#### 외부 라이브러리란?

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

#### CMakeLists.txt 파일의 구조

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

```cmake
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` 라이브러리를 사용하려면 다음과 같이 작성할 수 있다:

```cmake
find_package(Boost REQUIRED)
```

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

#### target\_link\_libraries() 명령어

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

* `PRIVATE`: 이 라이브러리는 오직 현재 대상(target)에서만 필요하다.
* `PUBLIC`: 이 라이브러리는 현재 대상 및 현재 대상을 사용하는 모든 대상에서 필요하다.
* `INTERFACE`: 이 라이브러리는 현재 대상을 사용하는 모든 대상에서만 필요하다.

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

```cmake
target_link_libraries(ProjectName PRIVATE Boost::boost)
```

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

#### include\_directories() 명령어

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

```cmake
include_directories(${Boost_INCLUDE_DIRS})
```

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

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

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

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

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

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

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

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

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

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

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

```cmake
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>
