深入了解 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-hk/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

發表回復

登錄後才能評論