iT邦幫忙

2025 iThome 鐵人賽

DAY 27
0

Cmake 的內從前面到今天為止也慢慢接近尾聲啦~
所以也趁這個機會來整理一下之前有整理到的幾個Cmake重要內容

1. CMake 的定位

(from Day 19 [make→cmake] 用cmake補足makefile的限制

  • CMake 本質不是編譯器,而是 建置系統產生器
  • 它負責讀取 CMakeLists.txt → 產生 Makefile / Ninja / Visual Studio / Xcode 專案
  • 這就是為什麼指令會分兩步:
cmake -S . -B build` # 產生Makefile/Ninja/VS solution)
cmake --build build -j` # 執行編譯(build,實際呼叫 make/ninja/msbuild)

2. add_executable / add_library

(from Day 22

  • 瞭解常用的 cmake 指令與選項(-S、-B、-G、-DCMAKE_BUILD_TYPE…)
  • 為什麼會產生 Makefile 或 build.ninja(Generator 的角色)
  • 逐行拆解一份簡單的 CMakeLists.txt
  • 建立指令 → CMakeLists.txt → 產物 的完整心智圖
CMakeLists.txt (描述規則)
       ↓
cmake -S . -B build (產生 Makefile) (-G Ninja可以產生Ninja)
       ↓
產生 build.ninja
       ↓
cmake --build build
       ↓
ninja 呼叫 gcc/clang 編譯 dog_meme.c、main.c → app

3. target_link_libraries

(from Day20) --> 這邊可以大概看懂CMakelist.txt 在做什麼

  • 提供一個完整的CMake
  • CMake可以大概分成 5 個區塊
  • Day20 Cmakelist的主要流程
    • 基本設定 → 專案名稱、版本、語言標準
    • Library 區塊 → 建立 dog_meme 函式庫
    • Executable 區塊 → 建立 app,並連結 dog_meme
    • 編譯細節 → 警告旗標、巨集定義、include 路徑
    • 安裝規則make install 時要放到哪裡
    1. 專案基本設定
cmake_minimum_required(VERSION 3.21)
project(C_PROJ VERSION 1.0.0 LANGUAGES C)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)

    1. 建立靜態函式庫 (Library) -> 靜態函式庫 --> 就是一堆 .o 檔打包起來的檔案
add_library(dog_meme STATIC
  src/dog_meme.c
)
target_include_directories(dog_meme
  PUBLIC
    ${CMAKE_SOURCE_DIR}/inc
)
  • add_library:建立一個靜態函式庫 dog_meme.a
  • target_include_directories (PUBLIC):讓任何連結 dog_meme 的 target 都能找到 inc/
    1. 建立可執行檔 (Executable)
add_executable(app
  src/main.c
)
target_link_libraries(app PRIVATE dog_meme)
    1. 編譯選項與巨集定義
target_compile_options(app PRIVATE -Wall -Wextra -Wpedantic)
target_compile_definitions(app PRIVATE APP_VERSION="1.0.0")
target_include_directories(app PRIVATE ${CMAKE_SOURCE_DIR}/inc)

  • target_compile_options:指定警告旗標(只對 app 有效)
  • target_compile_definitions:定義一個巨集 APP_VERSION="1.0.0"
  • target_include_directories (PRIVATE):再加一次 inc/,只對 app 生效(雖然 dog_meme 已經公開 inc 了,這裡等於保險措施)
    1. 安裝規則 (Install rules)
install(TARGETS app RUNTIME DESTINATION bin)
install(DIRECTORY inc/ DESTINATION include)

4. Build type 與 Compiler Options

(from Day19

  • 常見的 build type:
    • Debug(開啟 -g -O0)
    • Release(開啟 -O3)
    • RelWithDebInfo(-O2 + debug info)
    • MinSizeRel(針對大小最佳化)
  • 指定方式:
    cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug

5. Generator 選擇

(from Day 24
上面學會看CMake的檔案的語法跟知道CMake在做什麼之後,可以選擇CMake想要產生的編譯執行檔,例如你可以選擇Make 或是 Ninja

  • -G "Unix Makefiles" → 產生 Makefile (Linux 系統預設)
  • -G "Ninja" → 產生 Ninja build system(快很多)
  • -G "Visual Studio 17 2022" → 產生 VS solution
  • 用法:
    cmake -S . -B build -G "Ninja"

6. 學會網路上CMake的專案

(from Day 26)
這篇學會當拿到一個專案後,可以怎麼執行其中的Cmakelist.txt 並界網路上現有可以直接使用的模板資訊


上一篇
[Day 26] cmake 執行小練習
下一篇
[Day 28] [cmake] 測試與持續整合 (CTest + CPack + CI/CD)
系列文
30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言