1. 程式人生 > >CMake初步(2)

CMake初步(2)

1.4 詞法和語法

在開始本節的學習之前,我們先總結一下之前所瞭解到的CMake基本詞法和命令。

CMake命令通常使用如下的格式:
  1. COMMAND( ARG1 ARG2 … )
複製程式碼 命令關鍵字之後使用括號來包含所有的引數;各個引數之間使用空格或者換行符分隔;而引數通常有以下幾種形式:

變數,以${MY_VAIRABLE}的形式表達,其儲存型別為字串型別,但是可以根據具體命令的要求自動轉換為布林型、整型或者浮點型別。變數可以出現在字串中,也可以實現“內省”。變數有使用者自定義和系統內建兩種,使用者自定義變數使用SET命令設定;而系統變數由系統自動賦值,例如${PROJECT_SOURCE_DIR}。

列舉量,例如ADD_LIBRARY可以設定要生成的連結庫為SHARED或者STATIC,還可以設定為MODULE(外掛,可動態呼叫,但不作為其他工程的依賴),除此之外的賦值都是不能被識別的。

值,也就是任意的字串內容,它可以用來指示要編譯的原始碼檔名,也可以表達一段文字提示資訊,或者表達特定的功能。值可以使用引號進行標識,多數情況下也可以不用。

前文中我們已經瞭解到的命令列舉如下,此外這裡還簡要地介紹了另一些可能在各類CMake工程中遇到的命令及其語法格式。CMake部分命令的語法歌是十分複雜,這裡僅僅介紹它的某一種實現形式,建議讀者閱讀CMake的幫助文件以獲取更多資訊。

括號中為該命令的一個或多個引數項,其中使用“[…]”包含的項表示可忽略項,使用“…|…”分隔的項表示只能選擇其中一項。

ADD_CUSTOM_COMMAND(
    TARGET name 
    PRE_BUILD|PRE_LINK|POST_BUILD 
    COMMAND cmd1 [COMMAND cmd2 …] ):
為目標工程name新增一個或多個新的自定義的編譯規則cmd1,cmd2等,執行時機可以選擇編譯前,連結前或者編譯後。它的作用相當於Visual Studio工程的“Custom Build Step”屬性。

ADD_CUSTOM_TARGET( name COMMAND cmd1 [COMMAND cmd2 …] ):
新增一個名為name的編譯目標,並指定一個或多個自定義的命令cmd1,cmd2等。注意ADD_CUSTOM_COMMAND與這個命令的區別:前者是針對一個已有的子工程進行自定義編譯規則的設定;後者則是建立一個新的自定義的目標工程,例如一個專用於將已生成檔案拷貝到指定資料夾的INSTALL工程;以及與之作用截然相反的UNINSTALL工程。

ADD_DEFINITIONS( -DMACRO1 –DMACRO2 … ):
新增-D預編譯巨集定義,可以一次新增多個。

ADD_EXECUTABLE( name [WIN32]
                    source1 source2 … ):
指定一個名為name的可執行程式工程,其原始檔為source1,source2等,此外還可以追加一個列舉量WIN32,表示此程式為Win32程式,使用WinMain作為程式入口。

ADD_LIBRARY( name [STATIC|SHARED|MODULE]
                source1 source2 … ):
指定一個名為name的連結庫工程,其原始檔為source1,source2等,此外還可以指示該工程的生成結果為靜態庫(STATIC),動態庫(SHARED)還是模組(MODULE)。

ADD_SUBDIRECTORY( dir ):
指示下一級CMake指令碼所在位置位於dir子目錄。

CMAKE_MINIMUM_REQUIRED( VERSION major[.minor[.patch]] ):
指示當前指令碼所需的CMake版本,不能低於版本號major.minor.patch。

CONFIGURE_FILE( infile outfile ):
將檔案infile複製到outfile的位置,同時執行其中變數的自動配置和更替,即,將infile中所有形同“${VAR}”和“@
[email protected]
”的變數替換為對應的內容,並拷貝到outfile中,而這個新生成的outfile檔案也可以在之後的指令碼程式碼中得以使用。

FIND_LIBRARY( ${var}
                NAMES name1 [name2 …]
                PATHS path1 [path2 …]
                PATH_SUFFIXES suffix1 [suffix2 …] ):
搜尋一個外部的連結庫檔案,並將結果的全路徑儲存到var變數中。要搜尋的連結庫檔名字可能是name1,name2等;搜尋路徑為path1,path2等;此外還可以指定路徑的字尾詞為suffix1,suffix2等。因此,系統將嘗試在path1/suffix1,path1/suffix2,path2/suffix1,path2/suffix2這些目錄中搜索名為name1或name2的連結庫檔案,並將結果(路徑和檔名)儲存到var中。

FIND_PACKAGE( name ):
在指定的模組目錄中搜索一個名為Find<name>.cmake(例如,FindOSG.cmake)的CMake指令碼模組檔案,執行其中的內容,以圖搜尋到指定的外部依賴庫標頭檔案和庫檔案位置。

FIND_PATH( ${var}
            NAMES name1 [name2 …]
            PATHS path1 [path2 …]
            PATH_SUFFIXES suffix1 [suffix2 …] ):
搜尋一個包含name1,name2等檔案的目錄,並將此路徑(不包含檔名)儲存到var變數中,搜尋路徑為path1,path2等;此外還可以指定路徑的字尾詞為suffix1,suffix2等。通常可以使用此命令來確認外部標頭檔案的依賴路徑。

FIND_PROGRAM( ${var}
                 NAMES name1 [name2 …]
                 PATHS path1 [path2 …]
                 PATH_SUFFIXES suffix1 [suffix2 …] ):
搜尋一個外部的可執行程式,並將結果的全路徑儲存到var變數中。要搜尋的程式名字可能是name1,name2等;搜尋路徑為path1,path2等;此外還可以指定路徑的字尾詞為suffix1,suffix2等。

INCLUDE( file ):
在當前檔案中包含另一個CMake指令碼檔案的內容。

INCLUDE_DIRECTORIES( dir1 dir2 … ):
指定編譯器搜尋標頭檔案的依賴路徑,可以新增多個。

INSTALL( TARGETS proj1 proj2
         RUNTIME DESTINATION runtime_dir
         LIBRARY DESTINATION library_dir
         ARCHIVE DESTINATION archive_dir):
這只是此命令的一種語法格式,安裝目標工程proj1,proj2等到指定的資料夾。其中,可執行檔案安裝到RUNTIME DESTINATION指定的runtime_dir目錄;動態連結庫安裝到LIBRARY DESTINATION指定的library_dir目錄;靜態連結庫安裝到ARCHIVE DESTINATION指定的archive_dir目錄。如果需要安裝標頭檔案或者資料檔案,則通常使用INSTALL( FILES … DESTINATION … )的形式。

LINK_DIRECTORIES( dir1 dir2 … ):
設定外部依賴庫的搜尋路徑。

MESSAGE( [SEND_ERROR|STATUS|FATAL_ERROR] “text” … ):
在控制檯或者對話方塊輸出一行或多行除錯資訊文字text,列舉量用於控制資訊的型別(錯誤,狀態顯示,致命錯誤)。

OPTION( ${var} “text” value ):
向用戶提供一個可選項,提示資訊為text,初始值為value,並將最終的結果傳遞到var變數中。在CMake-GUI中它將以配置選項的方式出現。

PROJECT( name ):
設定整個工程的名稱為name。

SET( variable value
     [CACHE FILEPATH|PATH|STRING|BOOL “text”] ):
定義一個使用者自定義變數variable,取值為value。此外還可以使用CACHE關鍵字,允許使用者在CMake-GUI中修改變數的值,修改方式包括檔案對話方塊(FILEPATH),目錄對話方塊(PATH),編輯框(STRING)或者複選框(BOOL),並使用text作為提示資訊。

SET_TARGET_PROPERTIES( name PROPERTIES prop value ):
設定名為name的工程的屬性,這裡主要可選的prop屬性包括PROJECT_LABEL, DEBUG_POSTFIX,OUTPUT_NAME等等,value為設定值。

TARGET_LINK_LIBRARIES( name
                           lib1 lib2 …
                           [debug|optimized] lib1 lib2 … ):
指定工程name所用的依賴庫,並可以使用debug和optimized關鍵字分別指定DEBUG與RELEASE版本所用的一個或多個依賴庫。

相關推薦

CMake初步2

1.4 詞法和語法 在開始本節的學習之前,我們先總結一下之前所瞭解到的CMake基本詞法和命令。 CMake命令通常使用如下的格式: COMMAND( ARG1 ARG2 … ) 複製程式碼 命令關鍵字之後使用括號來包含所有的引數;各個引數之間使用空格或者換行符分隔;

CMake初步1

原文地址:http://blog.csdn.net/zxgis/article/details/7069493本章的主要目的並非介紹OpenSceneGraph的常用類和功能,而是介紹它的一個重要夥伴,抑或說,是一個被愈來愈多的開源軟體所青睞的強勁的輔助開發工具——CMak

CMake筆記2預定義變數

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

OpenGL學習筆記2-- openGL的配置和初步使用

引言 本文講述了筆者在VScode中配置openGL開發環境的和初步使用openGL的過程。因為實在是討厭VS的笨重和codeblocks介面的醜陋,所以花了一整天的時間成功地在VScode上配置了openGL的開發環境。其實是想玩玩VScode,自己建一個小小

半閒居士視覺SLAM十四講筆記2初識 SLAM- part 2 linux CMake、Kdevelop

該講詳細資料下載連結 【Baidu Yun】【Video】【Code】 若您覺得本博文對您有幫助,請支援高博的新書《視覺SLAM十四講》,【點選購買】 若您覺得本博文對您有幫助,請支援高

【CUDA並行程式設計系列2】CUDA簡介及CUDA初步程式設計

前言 CUDA並行程式設計系列是本人在學習CUDA時整理的資料,內容大都來源於對《CUDA並行程式設計:GPU程式設計指南》、《GPU高效能程式設計CUDA實戰》和CUDA Toolkit Documentation的整理。通過本系列整體介紹CUDA並行程式設

ReactNative之Redux入門2- 初步使用教程

注:本教程針對於有過React/ReactNative開發經驗的人群。redux的用法很靈活,根據專案需求,先來學習針對於react-native的基礎用法。[redux] + [react-redux] + [redux-thunk]我在整理之前原本是像直接講redux,但

ElasticSearch學習2安裝和初步使用

參考文件 1 安裝 1.1 確認Java版本 最新版ES 6.0.1至少需要Java 8 手冊上推薦Oracle JDK version 1.8.0_131 java -version echo $JAVA_HOME 1.2 Linux下安裝 curl -

【rust】Rust 的構建系統和包管理工具Cargo認識並初步使用2

運行 ron fin nim finished -- 傳遞 如何 兩個   Cargo 是 Rust 的構建系統和包管理工具,同時 Rustacean 們使用 Cargo 來管理它們的 Rust 項目。Cargo 負責三個工作:構建你的代碼,下載你代碼依賴的庫並編譯這些庫。

GOF23—單例模式2

應該 一個 img bsp 漏洞 資源 nbsp 創建 就會 本文介紹單例模式(不包含枚舉單例模式)漏洞問題以及如何防止漏洞   1.反射可以破解單例模式,例子如下:       此時,我們運行Client類,發現s1和s2是一個對象,但s3和s4是不同的對象。 那麽如何防

Linux的經常使用命令2 - 關機

計算機 pan spa 技術 eboot 使用 content con .net 關機命令 shutdown?h now 馬上進行關機 shutdown?r now 如今又一次啟動計算機 -t sec : -t後面加秒數,即”過幾秒後關機” -k : 不是要真

樹講解2——樹的輸入,重心,直徑

str 樹的直徑 names n) ostream push main define span one.樹的輸入 1.輸入每個節點父親節點的編號 #include<vector> #include<stdio.h> #include<

數據結構-線性表2

順序 序表 表示 元素 額外 alt 最大 spa 位置 線性表定義: 線性表是最基本、最簡單、也是最經常使用的一種數據結構。線性表中數據元素之間的關系是一對一的關系,即除了第一個和最後一個數據元素之外,其他數據元素都是首尾相接的。線性表的邏輯結構簡單,便於實現

Windows Phone開發2:豎立自信,初試鋒茫

一鍵 優秀 保持 知識 sdn ant emulator 一個 動畫 上一篇文章中,我們聊了一些“大炮”話題,從這篇文章開始,我們一起來學習WP開發吧。 一、我們有哪些裝備。 安裝完VS 學習版 for WP後,也連同SDK一並安裝了,不必像安卓那樣,安裝JDK,下載

斷點 相關技術與原理2

def pan 保存 ollydbg php class 工具 code http 繼續對OD的斷點技術做個筆記。 1、硬件斷點: Intel CPU中有8個調試寄存器(Debug Register)DR0 — DR7,當中DR0 — DR3用於設置硬件斷點地址,D

英語每日句子 2

農場 pan 貧困 make bsp col nvi cal style 1、She made a forceful impression on me. 她給我留下了深刻的印象 註:make/leave a (forceful/deep) impression on s

ajax初步1

request get lin tel sogo 調用 oca head sta 搭建服務器環境,創建一個文件夾,本篇搭建為wamp環境,在www目錄下,創建ajax文件夾。 ajax概念: AJAX 指異步JavaScript及XML(Asynchronous JavaS

Hibernate的增刪改查操作2

rac result jlist static 面向 原生 comm public set 一、在Hibernate中使用原生SQL語句 sql語句面向的是數據庫,所以sql語句中對應的不再是bean了,比如sql="select * from user" 在hql中

Linux存儲管理2

linux 空間 能力 用戶 RAID磁盤陣列,簡稱獨立磁盤冗余陣列。可以將多個硬盤按不同方式組合在一起形成一個硬盤組,從而產生比單個硬盤更高的存儲行能和數據備份功能;使多個磁盤實現並行讀寫;擁有容錯能力;用戶可以對組成的硬盤組進行格式化,掛載等操作,與單個硬盤的操作一模一樣,但其存儲速度

perl入門知識2

連接符 用法 num 路徑 常用函數 表示 取余 運算符 內容 交互式編程你可以在命令行中使用 -e 選項來輸入語句來執行代碼,實例如下:$ perl -e ‘print "Hello World\n"‘輸入以上命令,回車後,輸出結果為:Hello World 腳本式編程