
---
通常會發現有許教學都是在使用***CMake2.x***來教學,不過這篇是使用***CMake3.x***來學習,兩者差異差在哪呢?
基本上一樣是基於3.x是2.x的修正進化版。
1. CMake 3.x版本引入了許多新的語法和功能改進,使得CMake文件的編寫更簡單、更直觀,並提供更多的靈活性。
2. CMake 3.x引入了目標屬性系統,這是一個重大的變化,可以通過目標屬性更好地管理編譯和連接過程。
3. CMake 3.x提供了更強大的自動化測試功能,包括CTest(測試框架)和CPack(軟體打包工具)的改進。
4. CMake 3.x更好地支援新的編譯器和工具鏈,以適應不斷變化的編程環境。
5. CMake 3.x包括對構建過程的性能和優化方面的改進,以提高構建速度和效率。
## 如何下載(**linux/macOS**以HomeBrew為例)
```CMD!
brew install cmake
```
## CMake應用
主要有善於build ,test和打包package software ,不依賴於任何平台或編譯器,使用CMakeLists.txt來編譯建立**makefile** & **workspaces** ,可以產生 **靜態函式庫.a** & **共享函式庫.so**,以及連結**OpenCV** & **Point Cloud Library**
CMake 是一個自動編譯,測試和 packaging 的系統。一個尋常的 CMake workflow 如下:
> 1. 在專案資料夾下建立 CMakeLists.txt 檔案
這一個步驟是在告訴CMake要尋找這個檔案,如果檔案名稱錯誤或者大小寫錯誤都會造成在編譯的過程產生錯誤。
```cmake
touch CMakeLists.txt
```

> 2. 建立一個資料夾build。
```cmake
mkdir build
```
:no_entry_sign: 此時會發現這個資料夾是空的

> 3. 呼叫命令 cmake <CMakeLists.txt 所在的資料夾>。
這一步驟 cmake 會走訪整個專案資料夾,並讀取在子資料夾的 CMakeLists.txt。完成後會自動產生幾個重要的資料夾和檔案,部分列舉如下:
1. CMakeCache.txt: 這會紀錄 configuration 的結果
2. CMakeFile 資料夾
3. cmake_install.cmake: 編譯完成的安裝檔
4. Makefile
最後還有一個 <project name>的資料夾
```cmake
cmake ..
```
在build資料夾當中使用這個指令會出現以下情況,看到***Build files have been written to:*** 就代表有找到檔案位置

> 4. 呼叫命令 make <Makefile > 進行編譯。
這一個步驟是代表前置作業都已經做好了
```cmake
make
```

最後看到***1 warning generated.[100%] Linking CXX executable main[100%] Built target main***就代表編譯成功
最後你會看到以下架構,說明在build資料夾當中製作出了什麼東西:)

---
## 基本流程

---
## CMakeLists.txt如何撰寫
講到這邊你可能覺得CMake好像很簡單,不過他值得學習的地方還有如何撰寫CMakeLists.txt,那廢話不多說,馬上來學習如簡單撰寫出常用的CMakeLists.txt :dart:
以下列出常用的代表:
1. 設定最低CMake版本要求:
```cmake
cmake_minimum_required(VERSION 3.10)
```
2. 設定專案名稱:
```cmake
project(MyProject)
```
3. 添加標頭檔 :
```cmake
add_library(Game name.cpp)
```
4. 將源文件添加至專案中:
```cmake
add_executable(my_executable main.cpp helper.cpp)
```
5. 設定編譯選項:
```cmake
target_compile_options(my_executable PRIVATE -Wall -Wextra)
```
6. 連結外部庫:
```cmake
find_package(PkgConfig REQUIRED)
```
```cmake
pkg_check_modules(LIBRARY REQUIRED libname)
```
```cmake
target_include_directories(my_executable PRIVATE ${LIBRARY_INCLUDE_DIRS})
```
最簡單又常用:
```cmake
target_link_libraries(my_executable PRIVATE ${LIBRARY_LIBRARIES})
```
7. 條件編譯:
```cmake
option(ENABLE_FEATURE "Enable a feature" ON)
if(ENABLE_FEATURE)
add_definitions(-DENABLE_FEATURE)
endif()
```
8. 安裝目標文件和標頭文件:
```cmake
install(TARGETS my_executable DESTINATION bin)
```
```cmake
install(FILES helper.h DESTINATION include)
```
9. 定義命令:
```cmake
add_custom_target(my_custom_target COMMAND echo "Custom target")
```
當然還有許多語法,不過這篇主要說明常用的指令以及自己有涉略到的語法
---
## 關於複雜的工程文件...Makefile如何看懂?如何寫?
* Makefile的主體 - **Target**
:hand_with_index_and_middle_fingers_crossed: 待更新...
---
:ghost: 下一章--> **Git 版本控制**
©Copyright © 2023 by CHUNG HONG HAO. All Rights Reserved.