CMakeList文件詳解

本篇為《網(wǎng)易云課堂》學習筆記

基礎語法

    #設置參數(shù)
    set(var djasklfjksfkdsjf)
    
    #打印消息
    message("var = ${var}")
    
    #設置列表
    set(list_var 1 2 3 4 5)
    message("list_var: ${list_var}")
    
    #while循環(huán)
    set(a "")
    while (NOT a STREQUAL "xxx")
        set(a "${a}x") 
        message("a = ${a}")
    endwhile ()
    
    #列表遍歷
    foreach (item 1 2 3)    
        message("item = ${item}")
    endforeach (item)
    
    #范圍遍歷
    foreach (item RANGE 3)    
        message("item = ${item}")
    endforeach (item)
    
    #函數(shù)的使用(舉例為3個參數(shù))
    fnction(func a b c)    
        message("a = ${a}")    
        message("b = $")   
        message("c = ${c}")   
        #參數(shù)個數(shù)   
        message("ARGC = ${ARGC}")  
        #參數(shù)列表 
        message("ARGC = ${ARGV}") 
        #第一個參數(shù)  
        message("ARGC = ${ARGV0}") 
        #第二個參數(shù)   
        message("ARGC = ${ARGV1}")   
        #第三個參數(shù)  
        message("ARGC = ${ARGV2}")endfunction(func)
    func(1 2 3)

常用命令

cmake_miniumum_required cmake(VERSION 3.4.1)

  • 指定cmake最低支持的版本,
  • 命令可選,但是如果使用了高版本特有的命令就需要指定最低版本

aux_source_directory(. DIR_SRCS)

  • 第一個參數(shù):查找目錄
  • 第二個目錄:保存目錄的變量
  • 查找當前目錄所有源文件,并將源文件名稱保存到 DIR_SRCS 便變量
  • 不能查找子目錄

add_library

  1. 添加一個庫
* 添加庫文件,名稱為 <name>
* 指定庫類型:
    (1)STATIC:靜態(tài)庫
    (2)SHARED:動態(tài)庫
    (3)MODULE:在dyld(蘋果的鏈接庫)有效,此環(huán)境為等效于 SHARED
* EXCLUDE_FROM_ALL:表示該庫不會默認構建
* source1 source2 ... sourceN:用來指定庫的源文件
    add_library(
        native-lib#添加的庫<name>
        SHARE#指定的庫類型
        native-lib.cpp#指定庫的源文件
    )
  1. 導入預編譯庫
  • 添加一個已經存在的預編譯庫 <name>
  • 一般需要配合 set_target_properties 使用
    add_library(
        test
        SHARED
        IMPORTED#指定為導入的方式添加庫
    )
    set_target_properties(
        test#指明目標庫名
        PROPERTISE IMPORT_LOCATION#指明需要設置的參數(shù)
        #ANDROID_ABI為Android二進制接口,適配不同cpu目錄
        ${庫路徑}/${ANDROID_ABI}/libtest.so#參數(shù)的值(此處為路徑)
    )

-set

  • 設置CMAK變量
# 設置 可執(zhí)行文件(全局變量:EXECUTABLE_OUTPUT_PATH) 的輸出路徑
set(EXECUTABLE_OUTPUT_PATH [output_path])

# 設置 庫文件(全局變量:LIBRARY_OUTPUT_PATH) 的輸出路徑
set(LIBRARY_OUTPUT_PATH [output_path])

#設置C++編譯參數(shù)(全局變量:CMAKE_CXX_FLAGS)
set(CMAKE_CXX_FLAGS "-Wall std=c++11")

# 設置源文件集合(SOURCE_FILES 為本地變量不用記憶,此處為展示)
set(SOURCE_FILES main.cpp test.cpp ...)

include_directories

  • 設置頭文件目錄
  • 相當于g++中的 -I 參數(shù)
    #可以使用路徑和參數(shù)兩種形式
    include_directories(./include ${MY_INCLUDE})

add_executable(<name> ${SRC_LIST})

  • 定義了這個工程會生成一個文件名為<name>的可執(zhí)行文件,相關的源文件是SRC_LIST中定義的源文件列表

target_link_libraries(<name> lib1 lib2 lib3)

  • <>為目標庫的名稱
  • 將若干庫連接到目標庫文件
  • 鏈接的順序需要按照 gcc 鏈接順序規(guī)則,被鏈接的庫放在依賴它的庫的后面
    如標題:lib1依賴于lib2,lib2依賴于lib3,所以書寫順序為lib1 lib2 lib3

add_definitions(-DFOO -DDEBUG)

  • 為當前目錄以及子目錄的源文件加入 -D引入的define flag

add_subdirectory

  • 如果當前目錄包含子目錄時可以使用add_subdirectory,子目錄中也需要包含有CMakeLists.txt
    # sub_dir 指定包含CMakeList.txt 和源碼的子文件目錄
    #binary_dir 是輸出路徑,一般可以不指定
    add_subdirectory(sub_dir [binary_dir])

file

  • 文件操作指令
    #將message寫入到filename文件中,會覆蓋文件原有內容
    file(WRITE filename "message")
    
    #將message寫入到filename文件中,會追加在文件末尾
    file(APPEND filename "message")
    
    #從filename文件中讀取內容存儲到 var 中
    #[LIMIT numBytes] 為讀取的字節(jié)數(shù)上線
    #[OFFSET offset] 為讀取開始位置
    #[HEX] 指定內容以十六進制形式寫入 var
    file(READ filename var [LIMIT numBytes] [OFFSET offset] [HEX])
    
    #重命名文件
    file(RENAME <oldname> <newname>)
    
    #刪除文件 等同于  rm
    file(REMOVE [filel ...])
    
    #遞歸的刪除文件 等同于 rm -r
    file(REMOVE_RECURSE [filel ...])
    
    # 根據(jù)指定 url 下載文件(輸入?yún)?shù))
    # timeout 超時時間 (輸入?yún)?shù))
    # status 用來保存下載狀態(tài) (保存輸出參數(shù))
    # log 用來保存下載日志 (保存輸出參數(shù))
    # md5 用來校驗,如果指定了 md5會自動進行校驗,不一致會返回一個錯誤(輸入?yún)?shù))
    # SHOW_PEOGRESS 打印顯示進度信息(輸入?yún)?shù))
    file(DOWNLOAD url file 
        [TIMEOUT timeout] 
        [STATUS status] 
        [LOG log] 
        [EXPECUTED_MD5 md] 
        [SHOW_PROGRESS])
        
    #創(chuàng)建目錄
    file(MAKE_DIRECTORY [dir1 dir2 ...])
    
    #將 path 轉換為 unix 的風格,保存在 result
    file(TO_CMAKE_PATH path result)
    
    #將 path 轉換為 當前系統(tǒng) 的風格,保存在 result:window使用“\”;unix使用"/"
    file(TO_NATIVE_PATH path result)
    
    #將所有匹配查詢表達式 [globbing expression] 的文件生成一個list
    # var 存儲查詢結果 list
    # 指定[RELATIVE path]  則查詢結果為于 path 的相對路徑
    file(GLOB var [RELATIVE path] [globbing expression]...)

set_directory_properties(PROPERTIES pro1 var1 pro2 var2)

  • 設置某個路徑的一種屬性
  • pro 指代屬性,var 為屬性的設置值
  • pro可選值如下:
    INCLUDE_DIRECTORIES
    LINK_DIRECTORIES
    INCLUDE_REGULAR_EXPRESSION
    ADDITIONAL_MAKE_CLEANFILES

set_propetry

  • 在規(guī)定的作用域設置一個命名屬性
  • PROGPERTY 是必須的
  • 第一個參數(shù)為屬性影響范圍
    GLOBAL :全局
    DIRECTORY [dir...]:默認為當前目錄,也可以用[dir]指定
    TARGET [target...] :指定作用域
    SOUCES [src...] :指定源文件
    TEST [test...] :指定測試作用域
    CACHE [ent...] :指定cache中已有的條目
    set_propertry(
        <GLOBAL | TARGET [target...] | SOUCES [src...] | TEST [test...] | CACHE [ent...]>
        [APPEND]
        PEOPERTY
        <name>
        [value...]
    )

注意事項匯總

添加預編譯庫(Android6.0之后)

上面使用add_library() + set_target_properties()的方式導入庫(詳見add_library)。
這個方式在Android6.0之后的使用會有問題,替換為一下方式

    # 使用 -set 命令 修改 flag 變量,在變量后追加 -L+dir
    # c文件使用 CMAKE_C_FLAGS    c++文件使用CMAKE_CXX_FLAGS
    # -L 為庫的查找命令
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L[SO所在目錄])
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容