Android cmake命令總結以及指令碼模板

amlloc發表於2019-02-18

常用cmake命令記錄及Cmake指令碼模板(對付日常開發幾乎已經夠用了)

指令總結方面可以直接檢視這個官方連結:cmake.org/cmake/help/…

這裡總結一些常用的命令及使用示例:

  • set

    • set (<variable> <value>... [PARENT_SCOPE])

      設定某個變數的值,作用域為當前函式或者當前資料夾,[PARENT_SCOPE]這個引數沒用過,參照官方文件可知似乎是將此變數設定在上一級作用域中(也就是父目錄或者呼叫函式)

      使用變數的方法:${}

  • file

    • file(WRITE <filename> <content>...)

      將content寫入指定檔案,如果檔案不存在則建立檔案;如果檔案存在則覆蓋該檔案

      示例:file(WRITE src/hello.txt "hello world")

    • file(APPEND <filename> <content>...)

      示例:file(APPEND src/hello.txt "hello world 2")

      將content以追加的形式寫入指定檔案

    • file(READ <filename> <variable> [OFFSET <offset>][LIMIT <max-in>] [HEX])

      <filename>檔案裡面的內容從偏移為<offset>的地方最多讀取<max-in>個內容,並放入<variable>進行儲存,HEX選項為16進位制讀取。

      示例:file(READ src/hello.txt context LIMIT 5)

    • file(GLOB <variable> [LIST_DIRECTORIES true|false] [RELATIVE <path>] [<globbing-expressions>...]) 生成<globbing-expressions>與之匹配的檔案列表並將其儲存到<variable>。Globbing表示式與正規表示式類似,但更簡單。如果RELATIVE指定了flag,則結果將作為給定路徑的相對路徑返回。

      預設情況下列出GLOB目錄 - 如果LIST_DIRECTORIES設定為false,則在結果中省略目錄 。

      示例:file(GLOB utils_src_cc src/utils/*.cc)

  • find_library()

    • find_library (<VAR> name1 [path1 path2 ...])

      此命令用於查詢庫。建立名為<VAR>的快取條目以儲存此命令的結果。如果找到庫,則結果儲存在變數中,除非清除變數,否則不會重複搜尋。如果找不到任何結果,結果將是<VAR>-NOTFOUND,並在下次使用相同變數呼叫find_library時再次嘗試搜尋。搜尋的庫的名稱由name1指定(值為庫的名稱,如libz.a,則name值為z)。可以在PATHS引數之後指定其他搜尋位置。

      示例:find_library( log-lib log)

  • add_library()

    使用指定的原始檔將庫新增到專案中。

    • add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])

      新增一個根據命令呼叫中列出的原始檔,構建名為<name>的庫目標。它<name>對應於邏輯目標名稱,並且在專案中必須是全域性唯一的。構建的庫的實際檔名是基於本機平臺(例如lib.a or .lib)的約定構造的。

      示例:

      add_library(
              ${PROJECT_NAME}
      
              SHARED
      
              ${src1} //可以配合file命令,但官方不建議這麼做,理由是cmake無法知曉有新的檔案加入
              ${src2}
              ${src3}
              )
      複製程式碼
    • add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED [GLOBAL])

      匯入名字為<name>的庫

      示例:

      add_library(myz SHARED IMPORTED)
      add_library(myz SHARED IMPORTED)
      #設定庫檔案所在路徑
      set_target_properties(myz PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libnative-static.a)
      複製程式碼
  • target_link_libraries()

    • target_link_libraries( ... ... ...)

      預設情況下,使用此簽名,庫依賴項是可傳遞的。當此目標連結到另一個目標時,連結到此目標的庫也將出現在另一個目標的連結行上。這個傳遞性的“連結介面”儲存在INTERFACE_LINK_LIBRARIES目標屬性,可以通過直接設定屬性來覆蓋。

      示例:target_link_libraries(${PROJECT_NAME} ${log-lib} ${z-lib})

  • include_directories()

    • include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

      將給定目錄新增到編譯器用於搜尋包含檔案的目錄中。相對路徑被解釋為相對於當前源目錄。include目錄被新增到當前CMakeLists檔案的目錄屬性 INCLUDE_DIRECTORIES 之中。他們對當前CMakeLists檔案中INCLUDE_DIRECTORIES屬性中也加入了每個目標的目標屬性。目標屬性值是生成器使用的值。

    示例:

    include_directories(
            src/dir1
            src/dir2
            src/dir3
            src/dir4
            )
    複製程式碼
  • 兩個Cmakelists.txt的例子:

    • 第一個

      cmake_minimum_required(VERSION 3.4.1)
      
      set(PROJECT_NAME AMLLOC)
      
      file(WRITE amlloc/hello.txt "asdasda")
      file(READ amlloc/hello.txt context LIMIT 5)
      file(APPEND amlloc/hello.txt ${context})
      
      file(GLOB amlloc_src amlloc/src/*.cpp)
      file(GLOB utils1_src_cc amlloc/src/utils/*.cc)
      file(GLOB utils2_src amlloc/src/utils2/*.cpp)
      file(GLOB utils3_src_cc amlloc/src/utils3/*/*.cc)
      file(GLOB utils3_src_c amlloc/src/utils4/*/*.c)
      file(GLOB utils4_src amlloc/src/utils5/*.c)
      
      
      
      find_library( log-lib log)
      find_library( z-lib z)
      
      include_directories(
              amlloc/src/utils/include
              amlloc/src/include
              amlloc/src/utils1
              amlloc/src/utils2/md5
              amlloc/src/utils2
              amlloc/src/utils3
              )
      
      
      
      add_library(
              ${PROJECT_NAME}
      
              SHARED
      
              ${amlloc_src}
              ${utils1_src_cc}
              ${utils2_src}
              ${utils3_src_cc}
              ${utils3_src_c}
              ${utils4_src}
              )
      target_link_libraries(${PROJECT_NAME}  ${log-lib} ${z-lib})
      複製程式碼
    • 第二個

      首先看Project的目錄結構

      ├── CMakeLists.txt
      ├── main.cpp
      └── module
          ├── CMakeLists.txt
          ├── GameSave.h
          ├── s_utils.cc
          ├── s_utils.h
          ├── log.cc
          ├── log.h
          ├── utils.cc
          └── utils.h
      複製程式碼

      子目錄:

      set(PROJECT_NAME module_demo)
      file(GLOB module_src ./*.cc)
      
      add_library(${PROJECT_NAME} SHARED ${module_src})
      find_library(log-lib log)
      target_link_libraries(${PROJECT_NAME}  ${log-lib})
      複製程式碼

      父目錄:

      cmake_minimum_required(VERSION 3.4.1)
      
      #find library log and the result is stored
      #in the var log-lib
      find_library(log-lib log)
      
      #get the .so directory
      set(DISTRIBUTION_DIR ${CMAKE_SOURCE_DIR}/../../../libs)
      
      add_library(gamesavesaty_module SHARED IMPORTED)
      
      set_target_properties(gamesavesaty_module
                            PROPERTIES IMPORTED_LOCATION
                            ${DISTRIBUTION_DIR}/armeabi/libmodule.so
                            )
      
      add_library(gamesavety SHARED IMPORTED)
      
      set_target_properties(gamesavety
                            PROPERTIES IMPORTED_LOCATION
                            ${DISTRIBUTION_DIR}/armeabi/libgamesavety.so
                            )
      
      
      
      #set c++ compiler
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
      
      set(PROJECT_NAME demo)
      
      
      #include the module header file
      include_directories(./module)
      
      #add source file in module
      add_subdirectory(module)
      
      #Adds a library target called PROJECT_NAME to be built
      #from the source file main.cpp and files in module.
      add_library(${PROJECT_NAME} SHARED main.cpp)
      
      include_directories(${DISTRIBUTION_DIR}/armeabi)
      
      #Specify libraries module_demo and log-lib to
      #use when linking project demo.
      target_link_libraries(${PROJECT_NAME} module_demo gamesavety gamesavesaty_module ${log-lib})
      複製程式碼

相關文章