【CMake】Android Studio 中使用 CMake 編譯單個 C++ 源文件 ( 常用的 CMake 命令解析 )
文章目錄
一、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
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小時內刪除侵權內容。