# 타겟 링크 설정

#### 타겟 링크 설정의 개념

CMake에서 "타겟"이란 실행 파일, 라이브러리 등을 의미한다. CMakeLists.txt에서 `target_link_libraries()` 명령어를 사용해 타겟에 특정 라이브러리나 다른 타겟을 연결할 수 있다. 이는 컴파일 단계에서 필요한 라이브러리들을 지정하고, 이들 라이브러리와 함께 타겟을 빌드하도록 지시하는 것이다.

#### `target_link_libraries()` 명령어의 기본 구조

`target_link_libraries()`의 기본 형식은 다음과 같다:

```cmake
target_link_libraries(<타겟 이름> [옵션] <라이브러리 또는 타겟>...)
```

여기서 `<타겟 이름>`은 연결하려는 타겟의 이름을, `<라이브러리 또는 타겟>`은 해당 타겟에 연결하고자 하는 외부 라이브러리나 다른 CMake 타겟을 의미한다. 예를 들어, `MyExecutable`이라는 타겟에 `MyLibrary`라는 라이브러리를 링크하려면 다음과 같이 작성할 수 있다:

```cmake
target_link_libraries(MyExecutable MyLibrary)
```

#### 타겟 링크의 옵션

CMake에서는 타겟 링크 시 여러 옵션을 제공한다. 주로 사용되는 옵션은 다음과 같다:

* `PRIVATE`: 타겟에서만 해당 라이브러리를 사용하며, 타겟을 사용하는 다른 타겟에는 영향을 미치지 않는다.
* `INTERFACE`: 해당 타겟을 사용하는 모든 타겟에서 해당 라이브러리를 사용하도록 한다. 하지만 타겟 자체에는 링크되지 않는다.
* `PUBLIC`: 타겟과 해당 타겟을 사용하는 모든 타겟에 해당 라이브러리를 링크한다.

예를 들어, 다음과 같이 `PRIVATE`, `PUBLIC`, `INTERFACE`를 사용할 수 있다:

```cmake
target_link_libraries(MyExecutable PRIVATE MyLibrary1)
target_link_libraries(MyExecutable PUBLIC MyLibrary2)
target_link_libraries(MyExecutable INTERFACE MyLibrary3)
```

#### 인터페이스 라이브러리와의 연동

`INTERFACE` 옵션은 인터페이스 라이브러리와 자주 사용된다. 인터페이스 라이브러리는 실제 라이브러리 파일이 없고, 단지 헤더 파일이나 컴파일 옵션 등의 설정만을 제공하는 라이브러리다. 예를 들어, 다음과 같이 인터페이스 라이브러리를 정의하고 사용할 수 있다:

```cmake
add_library(MyInterfaceLib INTERFACE)
target_include_directories(MyInterfaceLib INTERFACE include/)
target_link_libraries(MyExecutable INTERFACE MyInterfaceLib)
```

#### 시스템 라이브러리 링크

외부 시스템 라이브러리를 링크할 때도 `target_link_libraries()`를 사용할 수 있다. 예를 들어, POSIX 소켓 라이브러리인 `libpthread`를 연결하려면 다음과 같이 작성한다:

```cmake
target_link_libraries(MyExecutable pthread)
```

이 경우 `pthread`는 시스템에 이미 설치되어 있는 라이브러리로, 빌드 과정에서 자동으로 검색되고 링크된다.

#### 타겟 의존성 관리

CMake는 타겟 간의 의존성을 자동으로 관리한다. 예를 들어, `target_link_libraries()`를 사용해 다른 타겟을 링크할 경우, CMake는 해당 타겟을 먼저 빌드한 후에 현재 타겟을 빌드한다. 이를 통해 빌드 순서를 명시적으로 지정할 필요가 없어진다.

#### 타겟 링크의 영향

`target_link_libraries()`를 사용해 타겟에 라이브러리를 링크하면, 컴파일러는 해당 라이브러리의 경로와 파일을 참조해 타겟을 빌드하게 된다. 이때 링크된 라이브러리의 함수나 변수를 타겟에서 사용할 수 있게 된다. 또한, CMake는 링크된 라이브러리의 종속성까지 자동으로 처리해준다.

***

관련 자료:

* [CMake 공식 문서: target\_link\_libraries](https://cmake.org/cmake/help/latest/command/target_link_libraries.html)
* [CMake 튜토리얼](https://cmake.org/cmake/help/latest/guide/tutorial/index.html)
