CMake 保姆級教程

CMake 是一個跨平臺的構建工具,用于生成適合不同平臺和編譯器的構建系統文件(如 Makefile 或 Visual Studio 項目文件)。
在 Windows 下使用 CMake 構建項目時,CMake 會根據 CMakeLists.txt 文件生成適合 Windows 的構建系統文件(如 Visual Studio 項目文件)。以下是 Windows 下使用 CMake 的基本規則和步驟:

https://subingwen.cn/cmake/CMake-primer/#1-CMake%E6%A6%82%E8%BF%B0


1. CMakeLists.txt 文件的基本結構

CMakeLists.txt 是 CMake 的配置文件,用于定義項目的構建規則。以下是一個簡單的示例:

# 指定 CMake 的最低版本要求(不是必須的,這個version需要比本地使用的低就行)
cmake_minimum_required(VERSION 3.10)# 定義項目名稱和使用的編程語言(不寫默認情況支持所有語言)  project(<PROJECT-NAME> [<language-name>...]) 
project(MyProject CXX)# 添加可執行文件目標 add_executable(可執行程序名 所有源文件名稱.cpp)
add_executable(MyProgram main.cpp utils.cpp)# 添加編譯選項
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O2")# 添加庫文件(如果需要)
target_link_libraries(MyProgram some_library)# 注釋單行行(# )    注釋多行CMake 使用 #[[ ]] 形式進行塊注釋
#[[ 這是一個 CMakeLists.txt 文件。
這是一個 CMakeLists.txt 文件
這是一個 CMakeLists.txt 文件]]
set使用

定義變量

# 假設有很多.cpp文件,這些.cpp文件名需要被反復使用,每次都直接將它們的名字寫出來很麻煩,此時可以定義一個變量,將文件名對應的字符串存儲起來
# SET 指令的語法是:VAR:變量名   VALUE:變量值
set (var value)
set(SRC_LIST add.c  div.c   main.c  mult.c  sub.c)# 取值 ${變量名}
add_executable(app  ${SRC_LIST})   # 生成可執行程序

指定使用的C++標準

# 在編寫C++程序的時候,可能會用到C++11、C++14、C++17、C++20等新特性,那么就需要在編譯的時候在編譯命令中制定出要使用哪
#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#增加-std=c++14
set(CMAKE_CXX_STANDARD 14)
#增加-std=c++17
set(CMAKE_CXX_STANDARD 17)

指定輸出的路徑

# 定義一個變量用于存儲一個絕對路徑
set(HOME /home/robin/Linux/Sort)   
# 拼接好的路徑值設置給CMAKE_RUNTIME_OUTPUT_DIRECTORY 宏,設置可執行程序輸出目錄
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${HOME}/bin)# 設置庫文件的輸出目錄
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "D:/learn/C++/test/code/lib")# 設置靜態庫文件的輸出目錄
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "D:/learn/C++/test/code/lib")# 定義可執行文件
add_executable(MyProgram main.cpp)
# 為特定目標設置輸出目錄
set_target_properties(MyProgram PROPERTIESRUNTIME_OUTPUT_DIRECTORY "D:/learn/C++/test/code/bin"
)
搜索文件

如果一個項目里邊的源文件很多,在編寫CMakeLists.txt文件的時候不可能將項目目錄的各個文件一一羅列出來,這樣太麻煩也不現實。所以,在CMake中為我們提供了搜索文件的命令,可以使用file命令。

# GLOB: 將指定目錄下搜索到的滿足條件的所有文件名生成一個列表,并將其存儲到變量中。
# GLOB_RECURSE:遞歸搜索指定目錄,將搜索到的滿足條件的文件名生成一個列表,并將其存儲到變量中file(GLOB/GLOB_RECURSE 變量名 要搜索的文件路徑和文件類型) 
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)   # CMAKE_CURRENT_SOURCE_DIR 這個存儲路徑就是cmakefile.txt所在的路徑
# file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
# file(GLOB MAIN_HEAD ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)
指定頭文件

如果頭文件所在目錄發生改變,不需要把引用該頭文件所有的.cpp都進行修改,只需要需要對應的cmake文件

include_directories(headpath)
include_directories(${PROJECT_SOURCE_DIR}/include)
通過CMake 制作庫文件(動態庫/靜態庫)

制作靜態庫

add_library(庫名稱 STATIC 源文件1 [源文件2] ...) 

制作動態庫

add_library(庫名稱 SHARED 源文件1 [源文件2] ...) 
# 設置動態庫生成路徑
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)# 設置動態庫/靜態庫生成路徑
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
鏈接庫

鏈接靜態庫

link_libraries(<static lib> [<static lib>...])
  • 參數1:指定出要鏈接的靜態庫的名字
    可以是全名 libxxx.a 也可以是掐頭(lib)去尾(.a)之后的名字 xxx

鏈接動態庫


2. Windows 下的 CMake 使用步驟

(1) 安裝 CMake
  • 從 CMake 官網 下載并安裝 CMake。
  • 確保將 CMake 添加到系統環境變量中,以便在命令行中使用。
(2) 創建構建目錄

在項目根目錄下(CMakeLists.txt文件所在路徑),創建一個構建目錄(例如 build),用于存放生成的構建文件:

mkdir build
cd build
(3) 生成構建系統文件(執行cmake進行編譯)

使用 CMake 生成適合 Windows 的構建系統文件。以下是幾種常見的方式:

  • 生成 Visual Studio 項目文件

    cmake -G "Visual Studio 17 2022" ..
    

    這里的 "Visual Studio 17 2022" 是生成器的名稱,可以根據你的 Visual Studio 版本調整。

  • 指定平臺(x64 或 x86)
    如果需要指定目標平臺(如 64 位或 32 位),可以使用 -A 參數:

    cmake -G "Visual Studio 17 2022" -A x64 ..
    
(4) 構建項目

生成構建系統文件后,可以使用以下命令構建項目:

  • 使用 Visual Studio 構建
    打開生成的 .sln 文件,使用 Visual Studio 進行構建。

  • 使用 CMake 命令行構建

    cmake --build . --config Release
    

    這里的 --config Release 指定構建類型為 Release,也可以改為 Debug


3. CMakeLists.txt 的常用規則

(1) 添加源文件
# 手動指定源文件
add_executable(MyProgram main.cpp utils.cpp)# 自動查找所有 .cpp 文件
file(GLOB SOURCES "src/*.cpp")
add_executable(MyProgram ${SOURCES})
(2) 添加頭文件目錄
# 添加頭文件目錄
include_directories(include)# 或者使用 target_include_directories(推薦)
target_include_directories(MyProgram PUBLIC include)
(3) 鏈接庫文件
# 鏈接靜態庫或動態庫
target_link_libraries(MyProgram some_library)# 查找并鏈接系統庫(如 OpenGL)
find_package(OpenGL REQUIRED)
target_link_libraries(MyProgram OpenGL::GL)
(4) 設置編譯選項
# 設置全局編譯選項
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O2")# 設置目標特定的編譯選項
target_compile_options(MyProgram PRIVATE -Wall -O2)
(5) 設置輸出目錄
# 設置可執行文件的輸出目錄
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)# 設置庫文件的輸出目錄
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
(6) 添加子目錄

如果項目包含多個子項目,可以使用 add_subdirectory

add_subdirectory(subproject)

4. Windows 下的注意事項

(1) 路徑分隔符

在 Windows 下,路徑分隔符是反斜杠 \,但在 CMake 中建議使用正斜杠 /,因為 CMake 會自動處理路徑。

(2) 生成器選擇

Windows 下常用的生成器包括:

  • Visual Studio 17 2022:生成 Visual Studio 項目文件。
  • MinGW Makefiles:生成適用于 MinGW 的 Makefile。
(3) 動態鏈接庫

在 Windows 下,動態鏈接庫(DLL)的使用需要注意:

  • 確保 DLL 文件在運行時可以被找到(可以將其放在可執行文件目錄中)。
  • 使用 target_link_libraries 鏈接庫時,CMake 會自動處理導入庫(.lib 文件)。
(4) 調試與發布配置

CMake 支持多配置生成器(如 Visual Studio),可以通過 --config 參數指定構建類型:

cmake --build . --config Debug   # 調試模式
cmake --build . --config Release # 發布模式

5. 示例:完整的 CMakeLists.txt

以下是一個完整的 CMakeLists.txt 示例:

cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)# 添加頭文件目錄
include_directories(include)# 添加源文件
file(GLOB SOURCES "src/*.cpp")# 生成可執行文件
add_executable(MyProgram ${SOURCES})# 鏈接庫文件
target_link_libraries(MyProgram some_library)# 設置編譯選項
target_compile_options(MyProgram PRIVATE -Wall -O2)# 設置輸出目錄
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

6. 總結

  • 在 Windows 下使用 CMake 時,可以通過 -G 參數指定生成器(如 Visual Studio)。
  • CMakeLists.txt 文件定義了項目的構建規則,包括源文件、頭文件、庫文件和編譯選項。
  • 使用 cmake --build 可以方便地構建項目。

通過合理配置 CMakeLists.txt,可以在 Windows 下高效地管理和構建項目。

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

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

相關文章

zabbix數據庫溯源

0x00 背景 zabbix數據庫如果密碼泄露被登錄并新增管理員如何快速發現&#xff1f;并進行溯源&#xff1f; 本文介紹數據庫本身未開啟access log的情況。 0x01 實踐 Mysql 數據庫查insert SELECT * FROM sys.host_summary_by_statement_type where statement like %insert% 查…

Spring Boot集成PageHelper:輕松實現數據庫分頁功能

Spring Boot集成PageHelper&#xff1a;輕松實現數據庫分頁功能 1. 為什么需要分頁&#xff1f; 分頁是處理大數據量查詢的核心技術&#xff0c;其重要性體現在&#xff1a; 性能優化&#xff1a;避免單次查詢返回過多數據導致內存溢出或響應延遲。用戶體驗&#xff1a;前端展…

Spring Cloud之負載均衡之LoadBalance

目錄 負載均衡 問題 步驟 現象 什么是負載均衡&#xff1f; 負載均衡的一些實現 服務端負載均衡 客戶端負載均衡 使用Spring Cloud LoadBalance實現負載均衡 負載均衡策略 ?編輯 ?編輯LoadBalancer原理 服務部署 準備環境和數據 服務構建打包 啟動服務 上傳J…

數據無憂:自動備份策略全解析

引言 在信息化飛速發展的今天&#xff0c;數據已成為個人、企業乃至國家最為寶貴的資產之一。無論是日常辦公文檔、科研數據、客戶資料&#xff0c;還是個人隱私信息&#xff0c;一旦丟失或損壞&#xff0c;都可能帶來不可估量的損失。因此&#xff0c;備份文件作為數據安全的…

Latex2024安裝教程(附安裝包)Latex2024詳細圖文安裝教程

文章目錄 前言一、Latex2024下載二、Texlive 2024安裝教程1.準備安裝文件2.啟動安裝程序3.配置安裝選項4.開始安裝5.安裝完成6.TeX Live 2024 安裝后確認 三、Texstudio 安裝教程1.準備 Texstudio 安裝2.啟動 Texstudio 安裝向導3.選擇安裝位置4.等待安裝完成5.啟動 Texstudio6…

C++ 語法之函數和函數指針

在上一章中 C 語法之 指針的一些應用說明-CSDN博客 我們了解了指針變量&#xff0c;int *p;取變量a的地址這些。 那么函數同樣也有個地址&#xff0c;直接輸出函數名就可以得到地址&#xff0c;如下&#xff1a; #include<iostream> using namespace std; void fun() …

centos【rockylinux】安裝【supervisor】的注意事項【完整版】

重新加載 systemd 配置推薦使用pip的方式安裝 pip install supervisor 第二步&#xff1a;添加supervisord.conf配置文件 [unix_http_server] file/tmp/supervisor.sock ; UNIX socket 文件&#xff0c;supervisorctl 會使用 ;chmod0700 ; socket 文件的…

Spring Cloud Gateway 使用ribbon以及nacos實現灰度發布

1、Spring Cloud Gateway配置文件 gateway:userId-limit: 1000 agent-bff:ribbon:NFLoadBalancerRuleClassName: com.anlitech.gateway.gray.GrayRule operator-bff:ribbon:NFLoadBalancerRuleClassName: com.anlitech.gateway.gray.GrayRule spring:cloud:gateway:locator:en…

關于“碰一碰發視頻”系統的技術開發文檔框架

以下是關于“碰一碰發視頻”系統的技術開發文檔框架&#xff0c;涵蓋核心功能、技術選型、開發流程和關鍵模塊設計&#xff0c;幫助您快速搭建一站式解決方案 --- 隨著短視頻平臺的興起&#xff0c;用戶的創作與分享需求日益增長。而如何讓視頻分享更加便捷、有趣&#xff0c…

基于django+vue的購物商城系統

開發語言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.8數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;PyCharm 系統展示 系統首頁 熱賣商品 優惠資訊 個人中心 后臺登錄 管理員功能界面 用戶管理 商品分類管理…

Ardunio 連接OLED觸摸屏(SSD1106驅動 4針 IIC通信)

一、準備工作 1、硬件 UNO R3 &#xff1a;1套 OLED觸摸屏&#xff1a;1套 導線諾干 2、軟件 arduino 二、接線 UNO R3OLED5VVCCGNDGNDA5SCLA4SDA 腳位如下圖所示&#xff1a; Uno R3腳位圖 觸摸屏腳位圖 查閱顯示屏的驅動規格&#xff1a;通常顯示屏驅動芯片有SSD1306,SH110…

機器人技能列表

一、機器人制作基礎入門 &#xff08;一&#xff09;機器人概述 1.機器人的定義與分類 2.機器人的發展歷程與現狀 3.機器人在各領域的應用案例 &#xff08;二&#xff09;必備工具與材料 4.常用電子工具介紹&#xff08;萬用表、電烙鐵等&#xff09; 5.機械加工工具&…

07. 面向對象高級(2)_設計模式

什么是設計模式 一個問題通常有種解法&#xff0c;其中肯定有一種解法是最優的&#xff0c;這個最優的解法被人總結出來了&#xff0c;稱之為設計模式。 設計模式有20多種&#xff0c;對應20多種軟件開發中會遇到的問題。 關于設計模式&#xff0c;主要學什么&#xff1f; 解…

【面試場景題-Redis中String類型和map類型的區別】

今天在面試中碰到一個場景題&#xff1a;在 Redis 中存儲 100 萬用戶數據時&#xff0c;使用 String 類型和 Hash&#xff08;Map&#xff09;類型的主要區別是什么&#xff1f;體現在以下幾個方面&#xff1a; 1. 存儲結構與內存占用 String 類型 存儲方式&#xff1a;每個用…

計算機操作系統和進程

目錄 一. 操作系統 1. 操作系統的概念 2. 操作系統的功能 二. 進程 1. 進程的概念 2. 進程在系統中的管理 3. PBC &#xff08;1&#xff09;pid &#xff08;2&#xff09;內存指針 &#xff08;3&#xff09;文件標識符 4. 資源分配 5. 進程的調度 &#xff08;…

【Matlab GUI】封裝matlab GUI為exe文件

注&#xff1a;封裝后的exe還是需要有matlab環境才能運行 &#xff08;1&#xff09;安裝MCRinstaller.exe文件&#xff0c;在matlab安裝目錄下的toolbox/compiler/deploy/win64文件夾里 &#xff08;2&#xff09;安裝完MCRinstaller.exe&#xff0c;字命令窗口輸入&#x…

登山第二十梯:無人機實時自主探索——我是一只小小小鳥

文章目錄 一 摘要 二 資源 三 內容 一 摘要 自主探索是無人機 &#xff08;UAV&#xff09; 各種應用的基本問題。最近&#xff0c;基于 LiDAR 的探索因其能夠生成大規模環境的高精度點云地圖而受到廣泛關注。雖然點云本身就為導航提供了信息&#xff0c;但許多現有的勘探方…

JAVA序列化與反序列化URLDNS鏈CC1鏈

1、序列化的實現 java序列化的是對象屬性的&#xff0c;只有實現了Serializable或者Externalizable接口的類的對象才能被序列化為字節序列。&#xff08;不是則會拋出異常&#xff09;&#xff0c;靜態成員變量是屬于類的&#xff0c;所以靜態成員變量是不能被序列化的&#x…

SAP-ABAP: 采購申請創建(PR)BAPI_PR_CREATE 技術指南-詳解

BAPI_PR_CREATE 技術指南 用途&#xff1a;通過 RFC 接口創建 SAP 采購申請&#xff08;PR&#xff09;&#xff0c;支持自動化集成與批量處理。 一、功能概覽 類別說明核心功能創建標準采購申請、預留轉采購申請&#xff0c;支持多行項目及賬戶分配。集成場景與 MRP 系統、外…

Android7 Input(一)Android Input服務初始化

本系列博客主要描述Android 7.1系統中輸入管理服務InputManagerService的源碼分析。 概述 本文主要描述了InputManagerService服務的初始化和啟動&#xff0c;在Android7系統上InputManagerService服務的框架如下所示: 注&#xff1a;箭頭的方向&#xff0c;并不能真實代表數…