深入了解 CMake 變數

CMake 是一個功能豐富的自動化構建系統。它允許開發人員生成現代的、高效的構建過程,簡化跨平台構建工作,同時為廣大用戶提供便捷的可執行文件。

其中 ,變數是構建功能中最基本的一部分。

一、CMake 變數簡介

CMake 變數是用於存儲文本常量、數字以及布爾類型等的名稱值對,它們被廣泛用於構建腳本中的各種設置、任務和參數。

變數在 CMake 中的使用方式非常類似於其他編程語言中的變數,甚至更加靈活。它們可以被賦值、傳遞給函數、以及通過堆棧方式來管理上下文,最終用於控制構建和處理代碼的流程。

下面我們介紹幾個常用的變數:

1. CMAKE_變數 系列

CMAKE_變數 系列是一組預定義的變數,用於控制 CMake 及其生成器的行為。這些變數在 CMake 的內部使用,通常不需要修改。

cmake_minimum_required(VERSION 3.5)

message(STATUS "CMake Version: ${CMAKE_VERSION}")
message(STATUS "CMake Source Dir: ${CMAKE_SOURCE_DIR}")
message(STATUS "CMake Binary Dir: ${CMAKE_BINARY_DIR}")

上述代碼演示了如何使用 CMake 預定義變數 CMAKE_VERSION、CMAKE_SOURCE_DIR、CMAKE_BINARY_DIR 來顯示 Cmake本身的版本號及源碼路徑和目標路徑。

2. 構建選項

CMake 變數可以用於控制構建選項,比如編譯器標誌、依賴庫路徑、安裝路徑等。

下面我們定義了兩個常用的構建選項。

# Enable debug symbols by default
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Debug)
endif()

# Set the output directory 
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)

上述代碼片段將默認的構建類型設置為 Debug,並且定義了輸出目錄為 ${PROJECT_BINARY_DIR}/lib 或 ${PROJECT_BINARY_DIR}/bin。

3. 自定義變數

除了 CMake 預定義的變數和構建選項外,開發人員還可以自定義變數並將它們用於其他目的,例如:

1)自定義變數 PATHS,用於存儲依賴庫的位置:

set(PATHS "/usr/local/include" "/usr/include")
message(STATUS "Search paths: ${PATHS}")

2)自定義變數 SOURCES,用於存儲需要編譯的源文件列表:

file(GLOB SOURCES "${PROJECT_SOURCE_DIR}/src/*.cpp")
add_executable(myapp ${SOURCES})

二、CMake 變數的作用域

CMake 變數作為關鍵概念,它們擁有各自的作用域和生命周期。

變數的作用域被定義為變數的可見範圍,這取決於變數被定義的位置。在 CMake 中,變數的作用域主要分為以下幾種情況:

1. 全局變數

CMake 中的全局變數可以在 CMake 文件中任何地方進行定義,並且在整個 CMake 運行期間都有效。CMake 內置的變數和用戶自己定義的變數都是全局的。

下面定義了兩個全局變數:

set(GLOBAL_VAR "Global variable")
function(f)
  message(STATUS "Func: ${GLOBAL_VAR}")
endfunction()

f() # "Global variable"

2. 局部變數

局部變數只在它們被定義的函數中有效。

下面定義了兩個局部變數 UNITS 和 TOTAL,分別用於計算 list 中所有元素的和。

function(sum list)
  set(UNITS "")
  set(TOTAL 0)
  foreach(num ${list})
    math(EXPR TOTAL "${TOTAL} + ${num}")
  endforeach()
  message(STATUS "Sum: ${TOTAL}")
endfunction()

sum(1 2 3) # "Sum: 6"

3. CACHE 變數

CACHE 變數既可以作為全局變數,也可以作為本地變數。它們可以在運行 CMake 時被設置,然後保存到 CMake 緩存中,以便在之後的構建中重複使用。

下面示例中的 CACHE 變數用法:為可自定義安裝路徑的命令行界面添加一個選項。

option(INSTALL_MYAPP "Install MyApp" OFF)
if(INSTALL_MYAPP)
  set(INSTALL_DIR /usr/local/myapp CACHE PATH "Installation directory")
endif()

三、CMake 變數的擴展和轉義

CMake 提供了多種方式來擴展和轉義變數,以滿足各種複雜的需求。

1. 變數替換和擴展

CMake 支持將變數的值作為另一個變數的名稱來訪問、擴展變數以及在字元串中使用變數。

下面分別演示了三種方法:

set(FULL_NAME "Software Engineer")
set(AGE 30)

# Access variable by using another variable name
set(NEW_VAR "FULL_NAME")
message(STATUS "Access variable: ${${NEW_VAR}}")

# Expand variable in a string
set(MESSAGE "I am ${FULL_NAME}, ${AGE} years old")
message(STATUS "Expand variable in string: ${MESSAGE}")

# Append string to variable
set(PATH "/usr/local/include" CACHE PATH "Installation path")
set(PATH "${PATH}:/usr/include")
message(STATUS "Append string to variable: ${PATH}")

2. 變數引用和轉義

在一些特殊情況下,我們需要引用某些變數的文本值,例如將變數的值傳遞給 shell 命令。

下面演示了將變數作為命令行參數使用時的轉義。

set(PATH "/usr/local/my\ app" CACHE PATH "Installation path")
execute_process(COMMAND echo ${PATH}) # "/usr/local/my app"

四、CMake 命令和函數參數默認值和類型聲明

如果沒有為命令或函數傳遞足夠的參數,CMake 會發出警告並退出。

因此,CMake 允許在命令和函數中定義默認參數,以及指定參數類型,這樣可以在必要的時候在代碼中使用。

下面演示了如何為命令和函數定義默認值並聲明類型:

# Define default values
set(FILE_PATH "file.txt")
set(TEXT "Hello, World!")

# Declare parameter types
function(write_to_file FILE_NAME STRING)
  file(WRITE "${FILE_NAME}" "${STRING}")
endfunction()

write_to_file(${FILE_PATH} ${TEXT}) # Write "Hello, World!" to "file.txt"

結論

CMake 變數是 CMake 構建中最基本的概念之一,開發人員可以將變數用於各種設置、任務和參數中。同時,CMake 還提供了豐富的變數擴展和轉義方式,以及將參數默認值和類型聲明方式。熟練掌握這些技巧可以幫助開發人員更高效地編寫、管理 CMake 構建腳本。

原創文章,作者:BPQTJ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/371700.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
BPQTJ的頭像BPQTJ
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相關推薦

  • int類型變數的細節與注意事項

    本文將從 int 類型變數的定義、聲明、初始化、範圍、運算和類型轉換等方面,對 int 類型變數進行詳細闡述和講解,幫助讀者更好地掌握和應用 int 變數。 一、定義與聲明 int…

    編程 2025-04-29
  • Python input參數變數用法介紹

    本文將從多個方面對Python input括弧里參數變數進行闡述與詳解,並提供相應的代碼示例。 一、基本介紹 Python input()函數用於獲取用戶輸入。當程序運行到inpu…

    編程 2025-04-29
  • Python匿名變數的使用方法

    Python中的匿名變數是指使用「_」來代替變數名的特殊變數。這篇文章將從多個方面介紹匿名變數的使用方法。 一、作為佔位符 匿名變數通常用作佔位符,用於代替一個不需要使用的變數。例…

    編程 2025-04-29
  • Python變數在內存中的存儲

    該文章將從多個方面對Python變數在內存中的存儲進行詳細闡述,包括變數的聲明和賦值、變數的引用和指向、內存地址的變化、內存管理機制等。 一、聲明和賦值 在Python中,變數聲明…

    編程 2025-04-29
  • Python變數類型用法介紹

    Python是一種解釋型編程語言,它提供了豐富的數據類型,包括數字、字元串、列表、元組、集合、字典等。Python變數類型的定義是Python程序開發的基礎,本文將從以下幾個方面對…

    編程 2025-04-28
  • Python print輸出變數

    Python是一種腳本語言,語法簡單易懂,目前被廣泛應用於數據處理、人工智慧、web開發、遊戲開發等領域。其中print函數是Python中最常用的函數之一,用於將變數輸出到控制台…

    編程 2025-04-28
  • Python定義變數

    Python是一門高級編程語言,變數是Python編程中非常重要的一個概念。Python的變數定義方式非常簡單,可以在程序中隨時定義一個變數來存儲數據,這方便了整個程序的邏輯編寫,…

    編程 2025-04-28
  • Python中如何定義一個變數

    Python是一種高級編程語言,使用它您可以輕鬆地定義和操作變數。Python中的變數屬於動態類型變數,因此不需要在定義變數時指定其類型,而是在變數分配之前自動確定變數的數據類型。…

    編程 2025-04-28
  • Python每次運行變數加一:實現計數器功能

    Python編程語言中,每次執行程序都需要定義變數,而在實際開發中常常需要對變數進行計數或者累加操作,這時就需要了解如何在Python中實現計數器功能。本文將從以下幾個方面詳細講解…

    編程 2025-04-28
  • Python中局部變數通常出現在函數中

    在Python編程中,局部變數是在函數中定義的變數,只能在函數內部訪問。相比於全局變數,局部變數的作用域更加有限,但是它們可以提高代碼的模塊化,並減少變數名的混淆。 一、局部變數的…

    編程 2025-04-28

發表回復

登錄後才能評論