 --- 通常會發現有許教學都是在使用***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.
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.