1. 程式人生 > >CMake 預定義變數

CMake 預定義變數


本帖子適用於初學者,StepByStep的入門CMake,CMake也是一門程式語言,只不過是針對編譯和連結這種程式構建的過程的語言,學習基本語法就可以初步入門,後面需要什麼複雜的功能,進階掌握需要自己去查詢官方文件,後續會給出查閱的一些方式

CMake預定義變數

基本變數

  • PROJECT_SOURCE_DIR cmake命令後緊跟的目錄,一般是工程的根目錄
  • PROJECT_BINARY_DIR 執行cmake命令的目錄,通常是${PROJECT_SOURCE_DIR}/build
  • CMAKE_INCLUDE_PATH 系統環境變數,非cmake變數
  • CMAKE_LIBRARY_PATH 系統環境變數,非cmake變數
  • CMAKE_CURRENT_SOURCE_DIR 當前處理的CMakeLists.txt所在的路徑
  • CMAKE_CURRENT_BINARY_DIR target編譯目錄
    使用ADD_SURDIRECTORY(src bin)可以更改此變數的值
    SET(EXECUTABLE_OUTPUT_PATH <新路徑>)並不會對此變數有影響,只是改變了最終目標檔案的儲存路徑
  • CMAKE_CURRENT_LIST_FILE 輸出呼叫這個變數的CMakeLists.txt的完整路徑
  • CMAKE_CURRENT_LIST_LINE 輸出這個變數所在的行
  • CMAKE_MODULE_PATH 定義自己的cmake模組所在的路徑
    這個變數用於定義自己的cmake模組所在的路徑,如果你的工程比較複雜,有可能自己編寫一些cmake模組,比如SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然後可以用INCLUDE命令來呼叫自己的模組
  • EXECUTABLE_OUTPUT_PATH 重新定義目標二進位制可執行檔案的存放位置
  • LIBRARY_OUTPUT_PATH 重新定義目標連結庫檔案的存放位置
  • PROJECT_NAME 返回通過PROJECT指令定義的專案名稱
  • CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用來控制IF ELSE語句的書寫方式

環境變數

  • 使用$ENV{NAME}可以呼叫系統的環境變數,比如:
    MESSAGE(STATUS “HOME dir:”$ENV{HOME})
  • 設定環境變數的方式,SET(ENV{name} value)
  • CMAKE_INCLUDE_CURRENT_DIR
    • 自動新增CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到當前處理
      的CMakeLists.txt。
      相當於在每個CMakeLists.txt加入:
      INCLUDE_DIRECTORIES(<
      /span>CMAKECURRENTBINARYDIR<span>
      {CMAKE_CURRENT_BINARY_DIR} {CMAKE_CURRENT_SOURCE_DIR})
  • CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE
    • 將工程提供的標頭檔案目錄始終至於系統標頭檔案目錄的前面,當你定義的標頭檔案確實跟系統發
      生衝突時可以提供一些幫助。
  • CMAKE_INCLUDE_PATH、CMAKE_LIBRARY_PATH
    • 務必注意,這兩個是環境變數而不是cmake變數。
    • 使用方法是要在bash中用export或者在csh中使用set命令設定或者CMAKE_INCLUDE_PATH=/home/include cmake ..等方式。

也就是,如果標頭檔案沒有存放在常規路徑(/usr/include, /usr/local/include等),
則可以通過這些變數就行彌補。
比如hello.h存放在/usr/include/hello目錄,所以直接查詢肯定是找不到的。
前面我們直接使用了絕對路徑INCLUDE_DIRECTORIES(/usr/include/hello)告訴工
程這個標頭檔案目錄。為了將程式更智慧一點,
我們可以使用CMAKE_INCLUDE_PATH來進行,使用bash的方法
如下:
export CMAKE_INCLUDE_PATH=/usr/include/hello
然後在標頭檔案中將INCLUDE_DIRECTORIES(/usr/include/hello)替換為:
FIND_PATH(myHeader hello.h)
IF(myHeader)
INCLUDE_DIRECTORIES(${myHeader})
ENDIF(myHeader)

上述的一些指令我們在後面會介紹。
這裡簡單說明一下,FIND_PATH用來在指定路徑中搜索檔名,比如:
FIND_PATH(myHeader NAMES hello.h PATHS /usr/include
/usr/include/hello)
這裡我們沒有指定路徑,但是,cmake仍然可以幫我們找到hello.h存放的路徑,就是因
為我們設定了環境變數CMAKE_INCLUDE_PATH。
如果你不使用FIND_PATH,CMAKE_INCLUDE_PATH變數的設定是沒有作用的,你不能指
望它會直接為編譯器命令新增引數-I。
以此為例,CMAKE_LIBRARY_PATH可以用在FIND_LIBRARY中。
同樣,因為這些變數直接為FIND_指令所使用,所以所有使用FIND_指令的cmake模組都
會受益。

系統資訊

  • CMAKE_MAJOR_VERSION cmake主版本號,如3.2.2中的3
  • CMAKE_MINOR_VERSION cmake次版本號,如3.2.2中的2
  • CMAKE_PATCH_VERSION cmake補丁等級,如3.2.2中的2
  • CMAKE_SYSTEM 系統名稱,例如Linux-2.6.22
  • CAMKE_SYSTEM_NAME 不包含版本的系統名,如Linux
  • CMAKE_SYSTEM_VERSION 系統版本,如2.6.22
  • CMAKE_SYSTEM_PROCESSOR 處理器名稱,如i686
  • UNIX 在所有的類UNIX平臺為TRUE,包括OS X和cygwin
  • WIN32 在所有的win32平臺為TRUE,包括cygwin

開關選項

  • BUILD_SHARED_LIBS 控制預設的庫編譯方式。如果未進行設定,使用ADD_LIBRARY時又沒有指定庫型別,預設編譯生成的庫都是靜態庫
  • CMAKE_C_FLAGS 設定C編譯選項,也可以通過指令ADD_DEFINITIONS()新增
  • CMAKE_CXX_FLAGS 設定C++編譯選項,也可以通過指令ADD_DEFINITIONS()新增。
  • CMAKE_C_COMPILER:指定C編譯器
  • CMAKE_CXX_COMPILER:指定C++編譯器
  • CMAKE_BUILD_TYPE::build 型別(Debug, Release, …),CMAKE_BUILD_TYPE=Debug

變數的使用

  • 在CMakeLists.txt中指定,使用set
  • cmake命令中使用,如cmake -DBUILD_SHARED_LIBS=OFF

相關推薦

CMake 預定變數

本帖子適用於初學者,StepByStep的入門CMake,CMake也是一門程式語言,只不過是針對編譯和連結這種程式構建的過程的語言,學習基本語法就可以初步入門,後面需要什麼複雜的功能,進階掌握需要自己去查詢官方文件,後續會給出查閱的一些方式

CMake筆記(2)預定變數

CMake預定義變數 CMAKE_MAJOR_VERSION cmake主版本號,如2.8.6中的2。 CMAKE_MINOR_VERSION cmake次版本號,如2.8.6中的8。 CMAKE

cmake中一些預定變數

PROJECT_SOURCE_DIR 工程的根目錄PROJECT_BINARY_DIR 執行cmake命令的目錄,通常是${PROJECT_SOURCE_DIR}/buildCMAKE_INCLUDE

Linux Shell基礎 環境變數、位置引數變數預定變數

環境變數   環境變數和使用者自定義變數最主要的區別在於,環境變數是全域性變數,而使用者自定義變數是區域性變數。使用者自定義變數只在當前的 Shell 中生效,而環境變數會在當前 Shell 和這個 Shell 的所有子 Shell 中生效。如果把環境變數寫入相應的配

Shell中的預定變數

Shell中的預定義變數 就是 shell 設計者事先已經定義好的變數,可以直接在 shell 指令碼中使用 基本語法 $$ (功能描述:當前程序的程序號(PID)) $! (功能描述:後臺執行的最後一個程序的程序號(PID)) $? (功能描述:最後一次執行的命令的返回狀態。如果這

nginx自定義變數與內建預定變數

總覽 nginx可以使用變數簡化配置與提高配置的靈活性,所有的變數值都可以通過這種方式引用: $變數名 而nginx中的變數分為兩種,自定義變數與內建預定義變數 內建變數 宣告 可以在sever,http,location等標籤中使用set命令(非唯一)宣告變數,語

PHP_Day03_預定變數

<?php /* 介紹:預定義變數 作者:趙某~ 時間:2018/11/5 */ // 預定義的儲存全域性變數的陣列 $GLOBALS $var = 'Xust'; echo $var.'<br>'; # 訪問某個全域性變數方

php幾個預定變數 SERVER 'DOCUMENT ROOT'

                <?phpecho 'documentroot:'.$_SERVER['DOCUMENT_ROOT'].'<br>'; //根目錄,在apache的配置檔案裡定義:httpd.conf 比如:DocumentRoot "D:/work/php_root"ech

Linux基礎學習之Shell基礎——Bash變數——預定變數

1、預定義變數 預定義變數 作用 $? 最後一次執行的命令的返回狀態。如果這個變數的值為,證明上一個命令正確執行;如果這個變數的值為非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。

MATLAB的使用(四)運算子、關係與邏輯函式說明以及預定變數名說明

四則表示式關係操作符和邏輯操作符及其功能: 關係操作符: < 表示小於; = 表示大於等於; 表示大於 ; == 表示等於; ~= 表示約等於; 邏輯操作符: &am

Linux Shell中的變數-預定變數

參考:《Linux命令 / 編輯器與Shell程式設計》 ################################################ note that :與其他程式語言不同,Bash中的變數沒有資料型別的區別,變數中的值都是以字串的形式儲存的,如果

PHP中的預定變數$_SERVER引數詳解

     在PHP編碼中,經常遇到需要使用位址列的資訊,比如域名、訪問的URL、URL帶的引數等,這些資訊PHP伺服器都存在了預定義變數$_SERVER中。文件解釋:$_SERVER 是一個包含了諸如

makefile專題:預定變數的使用

關鍵詞: makefile中預定義的變數、自動變數的含義、特殊變數的含義 1. makefile中預定義的變數 自動變數: [email protected], $^, $<

C++中幾個預定變數的介紹

       在C++程式設計中,有幾個預定義變數,這幾個預定義變數在使用的時候很方便。比如,在C++中中為了獲取時間,常常需要借用C語言的藉口time或者CTime類,然後如果是簡單的獲取時間,通過

makefile 的主要預定變數及常用命令列選項

預定義變數                       含義$*               不包含副檔名的目標檔名稱。$+               所有的依賴檔案,以空格分開,並以出現的先後為序,可能包含重複的依賴檔案。$<               第一個依

【php手冊:變數預定變數

'argc'包含命令列模式下傳遞給該指令碼的引數的數目(如果執行在命令列模式下)。' GATEWAY_INTERFACE '伺服器使用的 CGI 規範的版本。'SERVER_ADDR'當前執行指令碼所在的伺服器的 IP 地址。例:::1'SERVER_NAME'當前執行指令碼所在的伺服器的主機名。例:loca

Shell入門知識5——預定變數

基本介紹 shell已經定義好的變數,可以在shell指令碼直接使用。 基本語法 $$ 當前程序的程序號 $! 後臺執行的最後一個程序的程序號 $? 最後一次執行的命令的

shell的預定變數

1. 預定義變數 預定義變數和環境變數相類似,也是在Shell一開始時就定義了的變數。所不同的是,使用者只能根據Shell的定義來使用這些變數,而不能重定義它。所有預定義變數都是由$符和另一個符號組成的,常用的Shell預定義變數如下表所示 變數名 含義

2.awk預定變數

預定義變數 就是awk事先定義的變數,不需要自定義就能直接驚醒使用的變數。 這裡介紹  FS  OFS  RS ORS  NR FNR NF FILENAME的簡單用法。 $n 前面已經講過 表示第n個欄位  $0 表示整條記錄 FS  filed separater 欄

Shell-一個shell學習預定變數

預定義變數 $# 命令列中引數的個數 $* 所有位置引數的內容 $? 上一條命令執行後返回的結果狀態  0 成功 非0 執行異常或者錯誤 $$ 當前程序的程序號 $! 後臺執行的最後一個程序號$0 當