【CMake】使用 CMake 將單模塊 C 項目構建為庫并鏈接主程序

LuckiBit

目錄

    • 1. 項目結構設計
      • 📦 結構說明
    • 2. 項目文件內容
      • 2.1 頂層 `CMakeLists.txt`
      • 2.2 模塊 `src/color/CMakeLists.txt` ?【推薦寫法】
      • ?是否需要寫 `project()`?
      • 2.3 模塊頭文件 `include/color.h`
      • 2.4 模塊實現文件 `src/color/color.c`
      • 2.5 主程序 `src/main.c`
    • 3. 構建與運行步驟
      • ? 運行輸出:
    • 4. 構建輸出目錄說明
    • 5. 跨平臺構建支持(Windows / macOS / Linux)
      • 🧠 在 CMake 中檢測平臺
      • 🔧 跨平臺構建命令
    • 6. 項目擴展建議
    • 7. 項目總結與回顧
    • 8. 最終項目結構(含構建結果)
    • ? 附錄:子模塊的 CMake 最佳寫法模板
    • 9. 結束語
    • 相關文章:

CMake 是現代 C/C++ 項目中最主流的構建工具之一。它不僅可以幫助開發者組織源代碼、管理依賴、構建庫文件,還能提升項目的模塊化程度和可維護性。

本文將以一個簡單模塊 color 為例,介紹如何使用 CMake:

  • 構建一個結構清晰的 C 項目;
  • 將模塊編譯為靜態庫;
  • 配置可執行程序鏈接庫;
  • 自定義庫輸出路徑;
  • 支持跨平臺構建(Windows/macOS/Linux)。

1. 項目結構設計

我們采用模塊化、分離構建思路組織項目結構:

your_project/
├── CMakeLists.txt           # 頂層 CMake 構建腳本
├── include/                 # 公共頭文件目錄
│   └── color.h
├── src/                     # 源文件目錄
│   ├── main.c               # 主程序入口
│   └── color/               # color 模塊目錄
│       ├── color.c
│       └── CMakeLists.txt   # color 模塊構建配置
└── build/                   # 構建輸出目錄(自動生成)

📦 結構說明

目錄/文件說明
include/放置對外公開頭文件,便于跨模塊引用
src/color/獨立模塊,具備獨立構建能力
build/構建輸出與源代碼分離,保持干凈
CMakeLists.txt配置統一構建規則與鏈接流程

2. 項目文件內容

2.1 頂層 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(ColorApp C)set(CMAKE_C_STANDARD 99)# 設置庫和可執行文件的輸出路徑
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)# 添加頭文件搜索路徑
include_directories(include)# 添加 color 模塊
add_subdirectory(src/color)# 添加主程序
add_executable(${PROJECT_NAME} src/main.c)# 鏈接 color 模塊庫
target_link_libraries(${PROJECT_NAME} color)

2.2 模塊 src/color/CMakeLists.txt ?【推薦寫法】

# 可選但推薦:模塊自身聲明(便于大型項目調試)
project(ColorModule C)# 構建靜態庫 color
add_library(color STATIC color.c)# 添加頭文件目錄(可供外部 target 使用)
target_include_directories(color PUBLIC ${CMAKE_SOURCE_DIR}/include)

?是否需要寫 project()

  • ? 小項目中可省略
  • ? 推薦添加,可讀性更強、利于 IDE 顯示模塊名、利于分組構建。
  • ?不要寫 cmake_minimum_required(),它只應在頂層寫一次。

2.3 模塊頭文件 include/color.h

#ifndef COLOR_H
#define COLOR_Hvoid set_color(void);#endif

2.4 模塊實現文件 src/color/color.c

#include <stdio.h>
#include "color.h"void set_color(void) {printf("Set color called!\n");
}

2.5 主程序 src/main.c

#include "color.h"int main() {set_color();return 0;
}

3. 構建與運行步驟

在項目根目錄下執行以下命令進行構建:

mkdir build
cd build
cmake ..
make
./bin/ColorApp

? 運行輸出:

Set color called!

4. 構建輸出目錄說明

借助 CMAKE_*_OUTPUT_DIRECTORY 變量,我們可以控制構建產物的輸出位置:

變量名描述示例輸出路徑
CMAKE_ARCHIVE_OUTPUT_DIRECTORY靜態庫 .a 輸出路徑build/lib/libcolor.a
CMAKE_LIBRARY_OUTPUT_DIRECTORY動態庫 .so 輸出路徑build/lib/libcolor.so
CMAKE_RUNTIME_OUTPUT_DIRECTORY可執行文件輸出路徑build/bin/ColorApp

5. 跨平臺構建支持(Windows / macOS / Linux)

🧠 在 CMake 中檢測平臺

if(WIN32)message(STATUS "Compiling on Windows")add_definitions(-DPLATFORM_WINDOWS)
elseif(APPLE)message(STATUS "Compiling on macOS")add_definitions(-DPLATFORM_MACOS)
elseif(UNIX)message(STATUS "Compiling on Linux")add_definitions(-DPLATFORM_LINUX)
endif()

🔧 跨平臺構建命令

平臺構建命令
Linux/macOScmake .. && make
Windows MinGWcmake -G "MinGW Makefiles" .. && mingw32-make
Windows Visual Studiocmake -G "Visual Studio 17 2022" .. (生成 .sln)

6. 項目擴展建議

你可以基于此結構輕松擴展為多模塊項目:

  • 新增模塊如 art, password

    • 創建目錄 src/art/,放入 art.c, art.h
    • 添加對應 CMakeLists.txt 和庫配置;
  • 所有模塊的頭文件統一放入 include/

  • 在頂層 CMakeLists.txt 中添加子目錄與鏈接即可;

  • 添加 tests/ 目錄引入單元測試框架如 CTestGoogle Test


7. 項目總結與回顧

關鍵點內容
使用 add_library() 構建靜態/動態庫模塊化構建
使用 target_link_libraries() 連接模塊清晰解耦
使用輸出變量設置生成目錄可控構建產物結構
模塊 + 主程序分離易于維護與擴展
支持跨平臺平臺適配Windows/macOS/Linux 構建

8. 最終項目結構(含構建結果)

your_project/
├── CMakeLists.txt                   # 頂層構建配置
├── include/
│   └── color.h                      # 模塊頭文件
├── src/
│   ├── main.c                       # 主程序
│   └── color/
│       ├── color.c                  # 模塊實現
│       └── CMakeLists.txt           # 模塊構建配置
├── build/
│   ├── lib/
│   │   └── libcolor.a              # 靜態庫輸出
│   └── bin/
│       └── ColorApp                # 主程序輸出

? 附錄:子模塊的 CMake 最佳寫法模板

# src/color/CMakeLists.txt
project(ColorModule C)add_library(color STATIC color.c)target_include_directories(color PUBLIC ${CMAKE_SOURCE_DIR}/include)

9. 結束語

  1. 本節內容已經全部介紹完畢,希望通過這篇文章,大家對 CMake 有了更深入的理解和認識。
  2. 感謝各位的閱讀和支持,如果覺得這篇文章對你有幫助,請不要吝惜你的點贊和評論,這對我們非常重要。再次感謝大家的關注和支持!點我關注??

相關文章:

  • 指針的神秘探險:從入門到精通的奇幻之旅 !

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914708.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914708.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從零開始的云計算生活——番外4,使用 Keepalived 實現 MySQL 高可用

目錄 前言 一、架構原理? ?Keepalived 作用? ?MySQL 主從復制? 二、環境準備? 服務器要求?&#xff1a; 安裝基礎軟件? 三、配置 MySQL 主從復制 四、配置 Keepalived 主節點配置?&#xff08;/etc/keepalived/keepalived.conf&#xff09; 從節點配置 五、…

list類的常用接口實現及迭代器

目錄 1. list類的介紹 2.list類的常用接口 2.1 list類的常用構造 2.2 list類對象的容量操作 2.3 list迭代器 2.4 list類的常用操作 3.list的模擬實現 1. list類的介紹 list代表的是雙向鏈表&#xff0c;常見的有創建&#xff0c;增&#xff0c;刪&#xff0c;改幾個接口…

vscode Cline接入火山引擎的Deepseek R1

創建火山引擎Deepseek R1的API 在火山引擎管理控制臺中創建Deepseek R1推理接入點&#xff08;大模型&#xff09;&#xff0c;創建成功后會看到下圖效果。在操作中選擇API調用&#xff0c;在頁面中選擇OpenAI SDK&#xff0c;按照步驟找到baseUrl地址和API_KEY&#xff0c;后續…

新手向:自動化圖片格式轉換工具

大家好&#xff01;今天我要分享一個非常實用的Python小工具——圖片格式批量轉換器。如果你經常需要處理大量不同格式的圖片文件&#xff0c;或者需要統一圖片格式以便于管理&#xff0c;那么這個工具將會成為你的得力助手&#xff01;一、為什么需要圖片格式轉換&#xff1f;…

CUDA中的內存管理、鎖頁內存、UVA統一虛擬地址、零拷貝、統一內存

文章目錄0 前言1 swap內存跟鎖頁內存2 UVA(Unified Virtual Addressing)統一虛擬地址3 先看最普通的cuda內存分配、釋放、傳輸4 申請鎖頁內存4.1 cudaHostAllocDefault4.2 cudaHostAllocPortable4.3 cudaHostAllocWriteCombined4.3 cudaHostAllocMapped4.4 幾種鎖頁內存總結4.5…

微服務環境下的灰度發布與金絲雀發布實戰經驗分享

微服務環境下的灰度發布與金絲雀發布實戰經驗分享 在大規模微服務架構中&#xff0c;如何平滑安全地上線新功能是每個后端團隊的痛點。本文將結合生產環境中的真實案例&#xff0c;分享灰度發布&#xff08;Gray Release&#xff09;與金絲雀發布&#xff08;Canary Release&am…

MEF 在 WPF 中的簡單應用

MEF核心筆記MEF 的開發模式主要適用于插件化的業務場景中&#xff0c;C/S 和 B/S 中都有相應的使用場景&#xff0c;其中包括但不限于 ASP.NET MVC 、ASP WebForms、WPF、UWP 等開發框架。當然&#xff0c;DotNet Core 也是支持的。 以下是搜索到一些比較好的博文供參考&#…

Gitlab跑CICD的時候,maven鏡像和pom.xml使用的maven版本沖突導致沒辦法build成功的解決方法

是這樣的&#xff01;最近遇到一個非常棘手的難題&#xff0c;我搞了大概2周時間才把他弄出來&#xff0c;因為自己搭了個私服的maven倉庫&#xff0c;他不像maven官方倉庫一樣&#xff0c;可以跟nginx一樣轉的&#xff0c;所以遇到好幾個難點&#xff01;第一點&#xff1a;就…

Linux內核IPv4路由查找:LPC-Trie算法的深度實踐

在互聯網基礎設施的核心領域,路由查找性能直接決定了網絡轉發效率。Linux內核作為現代網絡系統的基石,其IPv4路由子系統采用了一種名為LPC-Trie(Level-Compressed Trie) 的創新數據結構,在net/ipv4/fib_trie.c文件中實現了高效的路由管理方案。本文將深入剖析這一機制的設…

【設計模式】裝飾(器)模式 透明裝飾模式與半透明裝飾模式

裝飾模式&#xff08;Decorator Pattern&#xff09;詳解一、裝飾模式簡介 裝飾模式&#xff08;Decorator Pattern&#xff09; 是一種 結構型設計模式&#xff0c;它允許你動態地給對象添加行為或職責&#xff0c;而無需修改其源代碼&#xff0c;也不需要使用繼承來擴展功能。…

NAT原理與實驗指南:網絡地址轉換技術解析與實踐

NAT實驗 NAT&#xff08;Network Address Translation&#xff0c;網絡地址轉換&#xff09;&#xff1a; NAT技術的介紹&#xff1a; 隨著Internet用戶的快速增長&#xff0c;以及地址分配不均等因素&#xff0c;IPv4地址&#xff08;約40億的空間地址&#xff09;已經陷入不…

設計模式之【觀察者模式】

目錄 觀察者模式中的角色 通過一個簡單案例來演示觀察者模式 被觀察者接口 事件類型 up主類作為被觀察者 觀察者接口 粉絲類作為觀察者 測試 測試結果 觀察者模式中的角色 被觀察者(observable)觀察者(observer) 通過一個簡單案例來演示觀察者模式 被觀察者接口 /*…

Linux sudo host權限提升漏洞(CVE-2025-32462)復現與原理分析

免責聲明 本文所述漏洞復現方法僅供安全研究及授權測試使用&#xff1b; 任何個人/組織須在合法合規前提下實施&#xff0c;嚴禁用于非法目的&#xff1b; 作者不對任何濫用行為及后果負責&#xff0c;如發現新漏洞請及時聯系廠商并遵循漏洞披露規則。 漏洞簡述 Linux sudo是l…

【uni-ui】hbuilderx的uniapp 配置 -小程序左滑出現刪除等功能

1.網址&#xff1a;https://ext.dcloud.net.cn/plugin?id181](https://ext.dcloud.net.cn/plugin?id181) 2.csdn講解&#xff1a;https://blog.csdn.net/qq_40323256/article/details/114337128 3.uni-ui git&#xff1a;https://github.com/dcloudio/uni-ui 4.官方網址文檔&…

記一次POST請求中URL中文參數亂碼問題的解決方案

POST請求中URL中文參數亂碼前言&#xff1a;一個常見的開發痛點一、問題現象與原因深度解析1. 典型問題場景2. 根本原因分析URL編碼規范問題&#xff1a;編碼解碼過程不一致&#xff1a;IE瀏覽器特殊行為&#xff1a;二、前端解決方案1. 手動編碼URL參數&#xff08;推薦&#…

從存儲熱遷移流程了解 QEMU block layer

文章目錄存儲熱遷移流程總體流程代碼路徑QEMU Block layer架構簡述Block Job結構體設計狀態轉換Mirror block job拓撲結構構建過程數據結構存儲熱遷移流程 總體流程 Libvirt migrate 命令提供 copy-storage-all 選項支持存儲熱遷移&#xff0c;相應地&#xff0c;Libvirt 熱遷…

【設計模式】命令模式 (動作(Action)模式或事務(Transaction)模式)宏命令

命令模式&#xff08;Command Pattern&#xff09;詳解一、命令模式簡介 命令模式&#xff08;Command Pattern&#xff09; 是一種 行為型設計模式&#xff08;對象行為型模式&#xff09;&#xff0c;它將一個請求封裝為一個對象&#xff0c;從而使你可以用不同的請求對客戶進…

HTML5智能排班日歷:動態排班一目了然

這個日歷將具備以下功能: 顯示一個標準的月度日歷視圖。可以自由切換上一個月和下一個月。在日歷的每一天自動顯示當天值班的人員。您可以很方便地在文件中修改值班人員列表和排班的起始日期。包括:動態生成日歷網格處理月份切換根據排班規則計算并顯示每天的值班人員<!DO…

深度剖析C++生態系統:一門老牌語言如何在開源浪潮中煥發新生?

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、前言&#xff1a;C的“長壽秘訣”是什么&#xff1f; C 誕生已超過 40 年。它經歷了桌面應用、互聯網爆發、移動時代&#xff0c;再…

60個功能OfficeBox 萬彩辦公大師:PDF 格式轉換 OCR識別免費無廣告

各位辦公小能手們&#xff01;今天給大家介紹個超厲害的免費辦公工具套裝——OfficeBox萬彩辦公大師&#xff0c;是廣州萬彩科技整出來的。軟件下載地址安裝包 它里面有60多個沒廣告的綠色組件&#xff0c;簡直像個百寶箱&#xff01;涵蓋了PDF處理、格式轉換、OCR識別、屏幕錄…