CMake使用教程

一、CMake 簡介

CMake 是一個跨平臺的構建工具,用于自動化生成不同平臺(如 Makefile、Visual Studio、Xcode 等)的構建文件。它的核心是編寫 CMakeLists.txt 文件,定義項目的構建規則。


二、安裝 CMake

  • Linux:

    
    sudo apt-get install cmake
  • Windows:

    下載安裝包 CMake官網。

  • macOS:

    
    brew install cmake

三、基礎用法

1. 最小化 CMake 項目

創建一個 CMakeLists.txt 文件:


cmake_minimum_required(VERSION 3.10) # 指定 CMake 最低版本project(MyProject) # 項目名稱add_executable(my_app main.cpp) # 生成可執行文件
2. 構建項目

mkdir build && cd build # 創建構建目錄(推薦)cmake .. # 生成構建文件(如 Makefile)make # 編譯項目(Linux/macOS)

四、核心命令詳解

1. 定義項目

project(MyProject # 項目名VERSION 1.0.0 # 版本號(可選)LANGUAGES C CXX # 支持的語言(C/C++))
2. 添加可執行文件

add_executable(my_app          # 可執行文件名main.cpp # 源文件列表utils.cpp)
3. 添加庫

# 靜態庫add_library(my_lib STATIC lib.cpp)# 動態庫(SHARED)add_library(my_lib SHARED lib.cpp)
4. 鏈接庫到可執行文件

target_link_libraries(my_app PRIVATE my_lib)
5. 包含頭文件目錄

target_include_directories(my_app # 目標(可執行文件或庫)PRIVATE # 作用域(PUBLIC/PRIVATE/INTERFACE)include # 頭文件目錄)
6. 設置編譯選項

# 全局編譯選項add_compile_options(-Wall -Wextra)# 目標專屬選項target_compile_options(my_app PRIVATE -O2)
7. 變量與條件判斷

set(MY_VAR "value") # 定義變量if (WIN32)# Windows 平臺特有配置endif()

五、多目錄項目結構

1. 子目錄管理

project/├── CMakeLists.txt # 根目錄├── src/│ ├── CMakeLists.txt│ └── main.cpp└── lib/├── CMakeLists.txt└── my_lib.cpp

根目錄的 CMakeLists.txt


cmake_minimum_required(VERSION 3.10)project(MyProject)add_subdirectory(lib) # 包含子目錄add_sadd_subdirectory(src)

子目錄的 CMakeLists.txt(例如 src/CMakeLists.txt):

add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE my_lib)

六、常用變量

變量名說明
CMAKE_CXX_STANDARD設置 C++ 標準(如 11/14/17)
CMAKE_BUILD_TYPE構建類型(Debug/Release)
CMAKE_CXX_COMPILER指定編譯器路徑
PROJECT_SOURCE_DIR項目根目錄路徑

示例:

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_BUILD_TYPE Debug)

七、進階功能

1. 生成配置頭文件
configure_file(config.h.in           # 輸入文件config.h              # 輸出文件
)
2. 查找第三方庫
find_package(Boost REQUIRED COMPONENTS filesystem)
target_link_libraries(my_app PRIVATE Boost::filesystem)
3. 安裝目標
install(TARGETS my_app        # 安裝可執行文件DESTINATION bin       # 安裝路徑(默認 /usr/local/)
)
4. 自定義命令
add_custom_command(OUTPUT output_fileCOMMAND python3 script.pyDEPENDS input_file
)

八、常見問題

1. 如何生成 IDE 項目(如 Visual Studio)?
cmake -G "Visual Studio 17 2022" ..
2. 如何清理構建文件?
rm -rf build/          # Linux/macOS
3. 如何啟用調試信息?
set(CMAKE_BUILD_TYPE Debug)

九、完整示例

項目結構
demo/
├── CMakeLists.txt
├── include/
│   └── utils.h
├── src/
│   ├── main.cpp
│   └── utils.cpp
└── lib/└── math/├── CMakeLists.txt├── math.h└── math.cpp
根目錄 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(DemoProject VERSION 1.0)add_subdirectory(lib/math)   # 添加數學庫
add_subdirectory(src)# 設置 C++ 標準
set(CMAKE_CXX_STANDARD 17)
lib/math/CMakeLists.txt
add_library(math STATIC math.cpp)
target_include_directories(math PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
src/CMakeLists.txt
add_executable(demo main.cpp utils.cpp)
target_include_directories(demo PRIVATE ../include)
target_link_libraries(demo PRIVATE math)

參考資料:

CMake文檔:CMake Documentation。

?

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

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

相關文章

大模型Rag - 兩大檢索技術

一、稀疏檢索:關鍵詞匹配的經典代表 稀疏檢索是一種基于關鍵詞統計的傳統檢索方法。其基本思想是:通過詞頻和文檔頻率來衡量一個文檔與查詢的相關性。 核心原理 文檔和查詢都被表示為稀疏向量(如詞袋模型),只有在詞…

LNA設計

設計目的 為后級提供足夠的增益以克服后級電路噪聲 盡可能小的噪聲和信號失真 確保輸入和輸出端的阻抗匹配 確保信號線性度 評價標準 噪聲系數 功率增益 工作頻率和帶寬 輸入信號功率動態范圍 端口電壓駐波比 穩定性 基于SP模型的LNA設計 直流分析 S參數分析 設計指標 &#xf…

Vue 常見組件及使用方式全解析

一、引言 在 Vue 開發中,組件是構建復雜用戶界面的基石。通過使用各種常見組件,我們可以快速搭建出功能豐富、交互性強的應用程序。本文將詳細介紹 Vue 開發中一些常見組件及其使用方式。 二、基礎 UI 組件 (一)按鈕組件&#…

設計測試用例模板

面試時問你一個場景,要你設計測試用例,你會怎么回答? 面試官讓你設計一個功能的測試用例,比如“上傳文件功能”,其實就是想考你: 思維是否全面能不能抓住重點會不會分類和使用測試方法有沒有考慮異常情況…

Git 解決“Filename too long”問題

在 Windows 系統中使用 Git 時,遇到 Filename too long 錯誤通常是由于系統默認的路徑長度限制(260 字符)導致的。以下是綜合多種場景的解決方案: 一、快速解決方法 啟用 Git 長路徑支持 通過 Git 配置命令允許處理超長文件名&am…

Spring Boot 3 + SpringDoc:打造接口文檔

1、背景公司 新項目使用SpringBoot3.0以上構建,其中需要對外輸出接口文檔。接口文檔一方面給到前端調試,另一方面給到測試使用。 2、SpringDoc 是什么? SpringDoc 是一個基于 Spring Boot 項目的庫,能夠自動根據項目中的配置、…

Swagger2Refit

把swagger相關接口轉成refit格式,以便其他服務調用 使用工具Refitter. Refitter 項目使用教程 Refit Client API Generator for OpenAPI 項目地址: github.com GitCode - 全球開發者的開源社區,開源代碼托管平臺 安裝 Refitter CLI 工具 首先,通過…

【java 13天進階Day05】數據結構,List,Set ,TreeSet集合,Collections工具類

常見的數據結構種類 集合是基于數據結構做出來的,不同的集合底層會采用不同的數據結構。不同的數據結構,功能和作用是不一樣的。數據結構: 數據結構指的是數據以什么方式組織在一起。不同的數據結構,增刪查的性能是不一樣的。不同…

systemctl管理指令

今天我們來繼續學習服務管理指令,接下來才是重頭戲-systemctl,那么話不多說,直接開始吧. systemctl管理指令 1.基本語法: systemctl [start | stop | restart | status]服務 注:systemctl指令管理的服務在/usr/lib/ systemd/system查看 2.systemctl設置服務的自…

STM32單片機教程:從零開始打造智能天氣時鐘

STM32單片機教程:從零開始打造智能天氣時鐘 大家好!今天我想為大家詳細介紹一下我們的STM32課程,以及如何從零基礎逐步掌握單片機開發技能,最終實現一個完整的智能天氣時鐘項目。 課程面向人群 本課程主要面向那些已經通過野火…

Neovim插件深度解析:mcphub.nvim如何用MCP協議重構開發體驗

在AI與工具鏈深度融合的今天,Neovim 作為現代開發者的生產力工具,正通過插件生態不斷突破邊界。mcphub.nvim 作為一款基于 MCP(Model Context Protocol) 協議的插件,重新定義了Neovim與智能工具的交互方式。它不僅簡化了MCP服務器的集成與管理,更通過直觀的UI和生態整合,…

第33講|遙感大模型在地學分類中的初探與實戰

目錄 ?? 一、什么是“遙感大模型”? ?? 二、遙感大模型在地學分類中的優勢 ??三、案例:使用 Segment Anything Model (SAM) 進行遙感地物分割 ?? 1. 安裝與依賴配置(PyTorch) ?? 2. 讀取遙感圖像(可用 Sentinel-2 偽彩色圖) ?? 3. SAM 模型載入 ?? …

MATLAB - 小車倒立擺的非線性模型預測控制(NMPC)

系列文章目錄 目錄 系列文章目錄 前言 一、擺錘/小車組件 二、系統方程 三、控制目標 四、控制結構 五、創建非線性 MPC 控制器 六、指定非線性設備模型 七、定義成本和約束 八、驗證非線性 MPC 控制器 九、狀態估計 十、MATLAB 中的閉環仿真 十一、使用 MATLAB 中…

JAVA文件I/O

目錄 一、三種路徑的分類: 1、絕對路徑: 2、相對路徑: 3、基準目錄: 二、文件的種類: 三、利用JAVA操作文件: 1、File類的構造方法: 2、File 類方法的使用: 使用例子&#…

焊接機器人的設計

一、引言 隨著制造業的發展,焊接工藝在各個領域得到廣泛應用。焊接機器人具有焊接質量高、效率高、勞動強度低等優點,能夠滿足現代制造業對焊接生產的要求。設計一款性能優良的焊接機器人,對于提高焊接生產的自動化水平和產品質量具有重要意…

Thymeleaf簡介

在Java中,模板引擎可以幫助生成文本輸出。常見的模板引擎包括FreeMarker、Velocity和Thymeleaf等 Thymeleaf是一個適用于Web和獨立環境的現代服務器端Java模板引擎。 Thymeleaf 和 JSP比較: Thymeleaf目前所作的工作和JSP有相似之處,Thyme…

(論文閱讀)RNNoise 基于遞歸神經網絡的噪聲抑制庫

RNNoise 是一個基于遞歸神經網絡的噪聲抑制庫。 有關該算法的描述見以下論文: J.-M. Valin, A Hybrid DSP/Deep Learning Approach to Real-Time Full-Band Speech Enhancement, Proceedings of IEEE Multimedia Signal Processing (MMSP) Workshop, arXiv:1709.08…

DevOps-文章目錄

01什么是DevOps 02DevOps基礎環境準備 03-DevOps-安裝并初始化Gitlab 04-DevOps-安裝并初始化Jenkins 05-DevOps-Jenkins自動拉取構建代碼1 05-DevOps-Jenkins自動拉取構建代碼2 06-DevOps-自動構建Docker鏡像 07-DevOps-安裝部署Harbor鏡像倉庫 08-DevOps-向Harbor上傳自定義鏡…

UML 狀態圖:以網絡媒體教學系統為例解析

目錄 一、系統概述 二、狀態圖分析 (一)登錄認證模塊 (二)課程選擇模塊 (三)視頻播放模塊 (四)退出登錄狀態 三、UML狀態圖繪畫 四、總結 UML狀態圖是一種行為圖&#xff0c…

交易模式革新:Eagle Trader APP上線,助力自營交易考試效率提升

近年來,金融行業隨著投資者需求的日益多樣化,衍生出了眾多不同的交易方式。例如,為了幫助新手小白建立交易基礎,誕生了各類跟單社區;而與此同時,一種備受矚目的交易方式 —— 自營交易模式,正吸…