# 실제 프로젝트 예제

CMake를 사용한 실제 프로젝트 예제를 통해 CMake의 사용 방법과 구조를 이해해보겠다. 이 예제에서는 간단한 C++ 프로젝트를 빌드하는 과정을 다루며, 프로젝트는 하나의 실행 파일을 생성하고, 외부 라이브러리를 포함하는 것으로 구성된다.

#### 프로젝트 구조

예제 프로젝트의 디렉토리 구조는 다음과 같다:

```
MyProject/
├── CMakeLists.txt
├── src/
│   ├── main.cpp
│   └── mylib.cpp
├── include/
│   └── mylib.h
└── external/
    └── CMakeLists.txt
```

* `src/`: 소스 파일들이 위치하는 디렉토리이다.
* `include/`: 헤더 파일들이 위치하는 디렉토리이다.
* `external/`: 외부 라이브러리를 관리하는 디렉토리이다.
* `CMakeLists.txt`: 프로젝트의 최상위 CMake 설정 파일이다.

#### CMakeLists.txt 파일 구성

**최상위 CMakeLists.txt**

먼저, 프로젝트의 최상위 `CMakeLists.txt` 파일을 작성한다.

```cmake
cmake_minimum_required(VERSION 3.10)

project(MyProject LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

include_directories(${CMAKE_SOURCE_DIR}/include)

add_subdirectory(src)
add_subdirectory(external)
```

이 파일에서는 프로젝트 이름을 `MyProject`로 설정하고, C++11 표준을 사용하도록 지정 하였다. `include_directories` 명령을 통해 `include/` 디렉토리를 포함 경로에 추가했으며, `add_subdirectory` 명령을 사용해 `src/`와 `external/` 디렉토리를 추가 하였다.

**src/CMakeLists.txt**

다음으로, `src/` 디렉토리 내의 `CMakeLists.txt` 파일을 작성한다.

```cmake
set(SOURCES
    main.cpp
    mylib.cpp
)

add_executable(MyProject ${SOURCES})

target_link_libraries(MyProject MyExternalLib)
```

이 파일에서는 `main.cpp`와 `mylib.cpp` 파일을 소스 파일로 지정하고, 이를 기반으로 `MyProject` 실행 파일을 생성한다. 또한, `target_link_libraries` 명령을 사용해 외부 라이브러리 `MyExternalLib`와 링크한다.

**external/CMakeLists.txt**

마지막으로, `external/` 디렉토리의 `CMakeLists.txt` 파일을 작성한다. 이 예제에서는 외부 라이브러리의 빌드 설정을 정의한다.

```cmake
add_library(MyExternalLib STATIC IMPORTED)

set_target_properties(MyExternalLib PROPERTIES
    IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/external/libMyExternalLib.a"
)
```

이 파일에서는 `MyExternalLib`라는 정적 라이브러리를 정의하고, `IMPORTED_LOCATION` 속성을 통해 외부 라이브러리 파일의 경로를 지정 하였다.

#### 소스 파일 작성

**main.cpp**

```cpp
#include "mylib.h"
#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    mylib_function();
    return 0;
}
```

`main.cpp`는 프로그램의 진입점으로, `mylib.h`에서 제공하는 함수를 호출한다.

**mylib.h**

```cpp
#pragma once

void mylib_function();
```

`mylib.h`는 `mylib.cpp`에서 구현된 함수의 선언을 포함하는 헤더 파일이다.

**mylib.cpp**

```cpp
#include "mylib.h"
#include <iostream>

void mylib_function() {
    std::cout << "MyLib Function Called!" << std::endl;
}
```

`mylib.cpp`는 `mylib_function`의 구현을 포함하며, 이 함수는 콘솔에 메시지를 출력한다.

#### 빌드 및 실행

이제 프로젝트를 빌드하고 실행할 수 있다.

1. 프로젝트 디렉토리로 이동한다:

   ```
   cd MyProject
   ```
2. 빌드 디렉토리를 생성하고 이동한다:

   ```
   mkdir build && cd build
   ```
3. CMake를 실행하여 빌드 파일을 생성한다:

   ```
   cmake ..
   ```
4. `make` 명령을 사용해 프로젝트를 빌드한다:

   ```
   make
   ```
5. 생성된 실행 파일을 실행한다:

   ```
   ./MyProject
   ```

이 과정이 성공적으로 완료되면, 프로그램이 실행되어 "Hello, World!"와 "MyLib Function Called!" 메시지를 출력한다.

이 예제는 CMake를 사용하여 간단한 C++ 프로젝트를 빌드하는 방법을 설명하며, 소스 파일 관리, 외부 라이브러리 포함, 빌드 설정 등을 다루었다.
