Android cmake命令總結以及腳本模板

經常使用cmake命令記錄及Cmake腳本模板(對付平常開發幾乎已經夠用了)html

指令總結方面能夠直接查看這個官方連接:cmake.org/cmake/help/…c++

這裏總結一些經常使用的命令及使用示例:正則表達式

  • setexpress

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

      設置某個變量的值,做用域爲當前函數或者當前文件夾,[PARENT_SCOPE]這個參數沒用過,參照官方文檔可知彷佛是將此變量設置在上一級做用域中(也就是父目錄或者調用函數)bash

      使用變量的方法:${}函數

  • fileui

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

      將content寫入指定文件,若是文件不存在則建立文件;若是文件存在則覆蓋該文件c++11

      示例: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})
      複製代碼
相關文章
相關標籤/搜索