target_include_directories
타겟을 컴파일 할 때 사용할 헤더 파일(include directories)을 찾기 위한 컴파일러의 검색 경로를 지정하는 커맨드이다. 즉, 빌드 대상 타겟이 헤더 파일을 찾기 위해 참조할 include 경로를 정의한다.
이를 통해 컴파일러가 `#include "파일명"` 또는 `#include <파일명>` 구문을 만났을 때, 어디를 탐색할 지 알 수 있다.
include directories는 절대 경로와 상대 경로 모두 지정 가능하다. 상대 경로는 현재 소스 디렉토리를 기준(CMAKE_CURRENT_SOURCE_DIR)으로 해석되고, 연관된 타겟 프로퍼티에 저장되기 전에 절대 경로로 변환된다. 그리고 target_include_directories()의 파라미터는 `$<>`와 같은 generator expression 문법 적용이 가능한데, generator expression을 사용하는 경우 항상 절대 경로로 간주된다. 예외가 있다면, `INSTALL_INTERFACE` generator expression 내에서는 상대 경로를 사용할 수 있다. installation prefix를 기준으로 상대 경로로 해석된다. `BUILD_INTERFACE` generator expression는 무조건 절대 경로를 작성하도록 하자. 예제:
target_include_directories(mylib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/mylib>
$<INSTALL_INTERFACE:include/mylib> # <prefix>/include/mylib
)
사용하는 상황
1. 외부 라이브러리 사용
보통 GNU 폴더 구조에서 include 디렉토리는 public 헤더들을 모아놓는 위치이다. 그래서 외부 라이브러리 파일들을 CMake로 설치해 보면 대부분 include 디렉토리에 헤더 파일들이 배치되어 있다. 이러한 헤더들을 라이브러리를 사용하는 타겟에 제공하기 위해
`target_include_directories()`를 사용한다.
2. 내부 라이브러리 또는 모듈 연결을 위해 컴파일 가능한 경로를 알려주는 역할
add_library(mylib STATIC
ui.cpp
)
target_include_directories(<내가 작성한 타겟> PUBLIC <내가 작성한 타겟의 소스가 있는 위치>)
- <내가 작성한 타겟>에는 mylib로 치환하면 된다.
- <내가 작성한 타겟의 소스가 있는 위치>에는 `CMAKE_CURRENT_SORUCE_DIR`로 치환하여 관리하는 것이 모던 CMake 형식을 따르게 된다. ` CMAKE_CURRENT_SORUCE_DIR `는 CMakeLists.txt가 존재하는 경로를 반환하며, 이로 인해 CMakeLists.txt는 소스파일이 있는 위치와 동일한 디렉토리에 두는 것이 좋다.
참고 자료
'CMake' 카테고리의 다른 글
[CMake] .cmake 파일의 사용 (0) | 2025.04.23 |
---|---|
[CMake] target_link_directories(), target_link_libraries() (0) | 2025.04.22 |
[CMake] target_link_libraries 커맨드 (0) | 2025.04.17 |
[CMake] CMAKE_PREFIX_PATH (0) | 2025.04.17 |
[CMake] find_package() (0) | 2025.04.16 |