CMake】Android Studio 中使用 CMake 編譯單個 C++ 源文件 ( 常用的 CMake 命令解析 )

      網友投稿 1527 2025-04-02

      文章目錄

      一、android studio 中使用 CMake 編譯單個 C++ 源文件

      二、cmake_minimum_required 命令設置最小 CMake 版本

      三、project 命令設置工程名稱

      四、add_library 命令設置生成函數庫

      五、find_library 命令設置查找函數庫

      六、target_link_libraries 命令設置鏈接函數庫

      七、CMakeLists.txt 詳細中文注釋

      該系列博客的應用場景是 android studio 下 NDK 編程 , 使用 CMake 構建 C/C++ 工程 ;

      一、Android Studio 中使用 CMake 編譯單個 C++ 源文件

      Android Studio 自動生成的 CMakeLists.txt 構建腳本就是默認編譯單個 C++ 源碼的構建腳本 ;

      cmake_minimum_required(VERSION 3.10.2) project("cmake") add_library( native-lib SHARED native-lib.cpp ) find_library( log-lib log ) target_link_libraries( native-lib ${log-lib} )

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      【CMake】Android Studio 中使用 CMake 編譯單個 C++ 源文件 ( 常用的 CMake 命令解析 )

      16

      下面開始逐個解析上面使用到的命令 ;

      CMakeList.txt 中使用到的命令一共只有 93 93 93 個, 47 47 47 個腳本命令 , 46 46 46 個工程命令 , 可以到 CMake 官方查詢這些命令的用法 , 在稍后的博客中也會逐一講解 Android Studio 中的 NDK 常用的 CMake 命令 ;

      參考 【CMake】CMake 引入 ( Android NDK 構建腳本 | CMake 命令手冊 ) 博客 ;

      二、cmake_minimum_required 命令設置最小 CMake 版本

      指定 CMake 最低版本 : 使用 cmake_minimum_required 命令 , 指定編譯 C/C++ 源碼的 CMake 工具的最低版本 , 這里會自動生成 ;

      # 指定 CMake 最低版本 cmake_minimum_required(VERSION 3.10.2)

      1

      2

      設置格式說明 : VERSION 是固定必須寫的 , VERSION 后面就是 CMake 的版本號 ;

      這里推薦大家一定要安裝最新的 CMake 版本 ;

      官方文檔地址 : https://cmake.org/cmake/help/latest/command/cmake_minimum_required.html

      三、project 命令設置工程名稱

      project 命令用于聲明工程名稱 , 同時還可以指定工程支持的語言 , 其中支持的語言可以忽略, 默認支持所有的語言 ;

      # 聲明項目并為項目命名. project("cmake")

      1

      2

      如果支持 C++ 語言的話 , 可以設置 project(“cmake” CXX) ;

      官方文檔地址 : https://cmake.org/cmake/help/latest/command/project.html

      四、add_library 命令設置生成函數庫

      add_library 命令用于設置生成函數庫 , 這個函數庫包括 so 動態庫 和 a 靜態庫 ;

      add_library 命令作用 : 創建函數庫并為函數庫命名.

      函數庫類型 : 設置該函數庫的類型 ① 靜態庫 STATIC ② 動態庫 SHARED.

      相對路徑 : 指定源碼路徑, 注意是相對路徑.

      函數庫個數據 : 可以定義多個函數庫, CMake 會負責構建這些函數庫.

      動態庫打包 : Gradle 會自動將動態庫打包到 APK 安裝包中.

      add_library 命令三個參數說明 :

      參數 1 : 設置生成的動態庫名稱.

      參數 2 : 設置生成的函數庫類型 : ① 靜態庫 STATIC ② 動態庫 SHARED.

      參數 3 : 配置要編譯的源文件.

      # 創建函數庫并為函數庫命名. # 函數庫類型 : 設置該函數庫的類型 ① 靜態庫 STATIC ② 動態庫 SHARED. # 相對路徑 : 指定源碼路徑, 注意是相對路徑. # 函數庫個數據 : 可以定義多個函數庫, CMake 會負責構建這些函數庫. # 動態庫打包 : Gradle 會自動將動態庫打包到 APK 安裝包中. add_library( # 參數 1 : 設置生成的動態庫名稱. native-lib # 參數 2 : 設置生成的函數庫類型 : ① 靜態庫 STATIC ② 動態庫 SHARED. SHARED # 參數 3 : 配置要編譯的源文件. native-lib.cpp )

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      官方文檔地址 : https://cmake.org/cmake/help/latest/command/add_library.html

      五、find_library 命令設置查找函數庫

      find_library 命令的作用是用于搜索函數庫 , 找到的函數庫的全路徑名稱保存到第一個參數變量中 ;

      搜索存儲 : 搜索指定的預編譯庫, 并存儲該預編譯庫的路徑到變量中, 這里存儲到了 log-lib 變量中.

      指定庫名稱 : CMake 的搜索路徑默認包含了系統庫, 只需要指定想添加的公共 NDK 庫的名稱即可, 這里指定 log 即可. 不需要指定 log 庫的完整路徑 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so.

      驗證存在性 : 在完成編譯之前, CMake 會驗證該函數庫是否存在.

      下面的構建腳本作用 : 到預設的目錄查找 log 庫 , 將找到的路徑賦值給 log-lib , 這個路徑是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so , 不同的 Android 版本號 和 CPU 架構 需要到對應的目錄中查找 , 此處是 29 版本 32 位 ARM 架構的日志庫

      # 搜索存儲 : 搜索指定的預編譯庫, 并存儲該預編譯庫的路徑到變量中, 這里存儲到了 log-lib 變量中. # 指定庫名稱 : CMake 的搜索路徑默認包含了系統庫, 只需要指定想添加的公共 NDK 庫的名稱即可, 這里指定 log 即可. # 不需要指定 log 庫的完整路徑 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so. # 驗證存在性 : 在完成編譯之前, CMake 會驗證該函數庫是否存在. # 到預設的目錄查找 log 庫 , 將找到的路徑賦值給 log-lib # 這個路徑是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so # 不同的 Android 版本號 和 CPU 架構 需要到對應的目錄中查找 , 此處是 29 版本 32 位 ARM 架構的日志庫 find_library( # 設置保存函數庫路徑的變量名稱. log-lib # 指定 CMake 想要定位的 NDK 庫名稱 log )

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      官方文檔地址 : https://cmake.org/cmake/help/latest/command/find_library.html

      六、target_link_libraries 命令設置鏈接函數庫

      target_link_libraries 命令的作用是為目標函數庫添加需要鏈接的函數庫 ;

      目標函數庫 : 就是在 Java / Kotlin 代碼中使用 System.loadLibrary(“native-lib”) 加載的動態庫 , 這是整個 C/C++ 代碼的調用入口 ;

      鏈接多個函數庫 : 指定 CMake 應該連接到目標函數庫的若干函數庫. 可以鏈接多個函數庫, 如使用的 Android NDK 函數庫, 預編譯的第三方函數庫, 系統庫等.

      鏈接函數庫命令參數說明 :

      參數 1 : 本構建腳本要生成的動態庫目 標

      參數 2 ~ … : 后面是之前預編譯的動態庫或靜態庫 , 或引入的動態庫

      # 指定 CMake 應該連接到目標函數庫的若干函數庫. # 可以鏈接多個函數庫, 如使用的 Android NDK 函數庫, 預編譯的第三方函數庫, 系統庫等. # 鏈接函數庫 # 參數 1 : 本構建腳本要生成的動態庫目 標 # 參數 2 ~ ... : 后面是之前預編譯的動態庫或靜態庫 , 或引入的動態庫 target_link_libraries( # 指定目標函數庫. native-lib # 鏈接目標庫到 NDK 中包含的日志庫. ${log-lib} )

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      官方文檔 : https://cmake.org/cmake/help/latest/command/target_link_libraries.html

      Kotlin 中的加載動態庫 : 與 Java 有些不同 , 這里展示一下 ;

      class MainActivity : AppCompatActivity() { /** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ external fun stringFromJNI(): String companion object { // Used to load the 'native-lib' library on application startup. init { System.loadLibrary("native-lib") } } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      七、CMakeLists.txt 詳細中文注釋

      下面就是自動生成的 CMake 配置文件 , 我添加中文注釋 :

      # 指定 CMake 最低版本 cmake_minimum_required(VERSION 3.10.2) # 聲明項目并為項目命名. project("cmake") # 創建函數庫并為函數庫命名. # 函數庫類型 : 設置該函數庫的類型 ① 靜態庫 STATIC ② 動態庫 SHARED. # 相對路徑 : 指定源碼路徑, 注意是相對路徑. # 函數庫個數據 : 可以定義多個函數庫, CMake 會負責構建這些函數庫. # 動態庫打包 : Gradle 會自動將動態庫打包到 APK 安裝包中. add_library( # 參數 1 : 設置生成的動態庫名稱. native-lib # 參數 2 : 設置生成的函數庫類型 : ① 靜態庫 STATIC ② 動態庫 SHARED. SHARED # 參數 3 : 配置要編譯的源文件. native-lib.cpp ) # 搜索存儲 : 搜索指定的預編譯庫, 并存儲該預編譯庫的路徑到變量中, 這里存儲到了 log-lib 變量中. # 指定庫名稱 : CMake 的搜索路徑默認包含了系統庫, 只需要指定想添加的公共 NDK 庫的名稱即可, 這里指定 log 即可. # 不需要指定 log 庫的完整路徑 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so. # 驗證存在性 : 在完成編譯之前, CMake 會驗證該函數庫是否存在. # 到預設的目錄查找 log 庫 , 將找到的路徑賦值給 log-lib # 這個路徑是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so # 不同的 Android 版本號 和 CPU 架構 需要到對應的目錄中查找 , 此處是 29 版本 32 位 ARM 架構的日志庫 find_library( # 設置保存函數庫路徑的變量名稱. log-lib # 指定 CMake 想要定位的 NDK 庫名稱 log ) # 指定 CMake 應該連接到目標函數庫的若干函數庫. # 可以鏈接多個函數庫, 如使用的 Android NDK 函數庫, 預編譯的第三方函數庫, 系統庫等. # 鏈接函數庫 # 參數 1 : 本構建腳本要生成的動態庫目 標 # 參數 2 ~ ... : 后面是之前預編譯的動態庫或靜態庫 , 或引入的動態庫 target_link_libraries( # 指定目標函數庫. native-lib # 鏈接目標庫到 NDK 中包含的日志庫. ${log-lib} )

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      Android Android Studio C++

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:使用正版Office2010的Win10用戶半價購Office365(win10 office365)
      下一篇:技術分享】WEB前端全棧成長計劃(二階段)-jQuery入門篇
      相關文章
      亚洲一区二区三区久久久久| 亚洲日本在线观看| 亚洲黄色在线观看视频| 亚洲精品无码久久久久去q | 国产成人综合亚洲| 亚洲免费综合色在线视频| wwwxxx亚洲| 亚洲AV日韩综合一区尤物| 亚洲欧洲日韩国产一区二区三区| 亚洲日本va在线观看| 亚洲人成77777在线观看网| 亚洲性线免费观看视频成熟| 久久精品国产亚洲AV蜜臀色欲| 亚洲啪啪免费视频| 亚洲一区免费在线观看| 亚洲乱码在线观看| 亚洲另类无码专区丝袜| 色窝窝亚洲av网| 亚洲国产成人五月综合网| 国产偷窥女洗浴在线观看亚洲| 久久久亚洲精品蜜桃臀| 亚洲精品你懂的在线观看| 亚洲成av人在线视| 亚洲国产高清在线| 亚洲大香伊人蕉在人依线| 国产精品亚洲精品青青青| 33333在线亚洲| 亚洲日韩精品无码专区加勒比| WWW国产亚洲精品久久麻豆| 亚洲精品A在线观看| 亚洲精品你懂的在线观看 | 亚洲人成无码网站在线观看| 亚洲高清一区二区三区电影| 国产亚洲视频在线观看网址| 亚洲人午夜射精精品日韩| 国产亚洲一区二区三区在线| 亚洲无删减国产精品一区| va天堂va亚洲va影视中文字幕| 亚洲av无码一区二区三区在线播放| 国产一区二区三区亚洲综合| 国产亚洲大尺度无码无码专线|