【CMake】Android Studio 中使用 CMake 编译单个 C++ 源文件 ( 常用的 CMake 命令解析 )
文章目錄
- 一、Android Studio 中使用 CMake 編譯單個 C++ 源文件
- 二、cmake_minimum_required 命令設(shè)置最小 CMake 版本
- 三、project 命令設(shè)置工程名稱
- 四、add_library 命令設(shè)置生成函數(shù)庫
- 五、find_library 命令設(shè)置查找函數(shù)庫
- 六、target_link_libraries 命令設(shè)置鏈接函數(shù)庫
- 七、CMakeLists.txt 詳細(xì)中文注釋
該系列博客的應(yīng)用場景是 Android Studio 下 NDK 編程 , 使用 CMake 構(gòu)建 C/C++ 工程 ;
一、Android Studio 中使用 CMake 編譯單個 C++ 源文件
Android Studio 自動生成的 CMakeLists.txt 構(gòu)建腳本就是默認(rèn)編譯單個 C++ 源碼的構(gòu)建腳本 ;
cmake_minimum_required(VERSION 3.10.2)project("cmake")add_library(native-libSHAREDnative-lib.cpp )find_library( log-liblog )target_link_libraries( native-lib${log-lib} )下面開始逐個解析上面使用到的命令 ;
CMakeList.txt 中使用到的命令一共只有 939393 個, 474747 個腳本命令 , 464646 個工程命令 , 可以到 CMake 官方查詢這些命令的用法 , 在稍后的博客中也會逐一講解 Android Studio 中的 NDK 常用的 CMake 命令 ;
參考 【CMake】CMake 引入 ( Android NDK 構(gòu)建腳本 | CMake 命令手冊 ) 博客 ;
二、cmake_minimum_required 命令設(shè)置最小 CMake 版本
指定 CMake 最低版本 : 使用 cmake_minimum_required 命令 , 指定編譯 C/C++ 源碼的 CMake 工具的最低版本 , 這里會自動生成 ;
# 指定 CMake 最低版本 cmake_minimum_required(VERSION 3.10.2)設(shè)置格式說明 : VERSION 是固定必須寫的 , VERSION 后面就是 CMake 的版本號 ;
這里推薦大家一定要安裝最新的 CMake 版本 ;
官方文檔地址 : https://cmake.org/cmake/help/latest/command/cmake_minimum_required.html
三、project 命令設(shè)置工程名稱
project 命令用于聲明工程名稱 , 同時還可以指定工程支持的語言 , 其中支持的語言可以忽略, 默認(rèn)支持所有的語言 ;
# 聲明項目并為項目命名. project("cmake")如果支持 C++ 語言的話 , 可以設(shè)置 project(“cmake” CXX) ;
官方文檔地址 : https://cmake.org/cmake/help/latest/command/project.html
四、add_library 命令設(shè)置生成函數(shù)庫
add_library 命令用于設(shè)置生成函數(shù)庫 , 這個函數(shù)庫包括 so 動態(tài)庫 和 a 靜態(tài)庫 ;
add_library 命令作用 : 創(chuàng)建函數(shù)庫并為函數(shù)庫命名.
-
函數(shù)庫類型 : 設(shè)置該函數(shù)庫的類型 ① 靜態(tài)庫 STATIC ② 動態(tài)庫 SHARED.
-
相對路徑 : 指定源碼路徑, 注意是相對路徑.
-
函數(shù)庫個數(shù)據(jù) : 可以定義多個函數(shù)庫, CMake 會負(fù)責(zé)構(gòu)建這些函數(shù)庫.
-
動態(tài)庫打包 : Gradle 會自動將動態(tài)庫打包到 APK 安裝包中.
add_library 命令三個參數(shù)說明 :
-
參數(shù) 1 : 設(shè)置生成的動態(tài)庫名稱.
-
參數(shù) 2 : 設(shè)置生成的函數(shù)庫類型 : ① 靜態(tài)庫 STATIC ② 動態(tài)庫 SHARED.
-
參數(shù) 3 : 配置要編譯的源文件.
官方文檔地址 : https://cmake.org/cmake/help/latest/command/add_library.html
五、find_library 命令設(shè)置查找函數(shù)庫
find_library 命令的作用是用于搜索函數(shù)庫 , 找到的函數(shù)庫的全路徑名稱保存到第一個參數(shù)變量中 ;
搜索存儲 : 搜索指定的預(yù)編譯庫, 并存儲該預(yù)編譯庫的路徑到變量中, 這里存儲到了 log-lib 變量中.
指定庫名稱 : CMake 的搜索路徑默認(rèn)包含了系統(tǒng)庫, 只需要指定想添加的公共 NDK 庫的名稱即可, 這里指定 log 即可. 不需要指定 log 庫的完整路徑 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so.
驗證存在性 : 在完成編譯之前, CMake 會驗證該函數(shù)庫是否存在.
下面的構(gòu)建腳本作用 : 到預(yù)設(shè)的目錄查找 log 庫 , 將找到的路徑賦值給 log-lib , 這個路徑是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so , 不同的 Android 版本號 和 CPU 架構(gòu) 需要到對應(yīng)的目錄中查找 , 此處是 29 版本 32 位 ARM 架構(gòu)的日志庫
# 搜索存儲 : 搜索指定的預(yù)編譯庫, 并存儲該預(yù)編譯庫的路徑到變量中, 這里存儲到了 log-lib 變量中. # 指定庫名稱 : CMake 的搜索路徑默認(rèn)包含了系統(tǒng)庫, 只需要指定想添加的公共 NDK 庫的名稱即可, 這里指定 log 即可. # 不需要指定 log 庫的完整路徑 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so. # 驗證存在性 : 在完成編譯之前, CMake 會驗證該函數(shù)庫是否存在.# 到預(yù)設(shè)的目錄查找 log 庫 , 將找到的路徑賦值給 log-lib # 這個路徑是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so # 不同的 Android 版本號 和 CPU 架構(gòu) 需要到對應(yīng)的目錄中查找 , 此處是 29 版本 32 位 ARM 架構(gòu)的日志庫find_library( # 設(shè)置保存函數(shù)庫路徑的變量名稱.log-lib# 指定 CMake 想要定位的 NDK 庫名稱log )官方文檔地址 : https://cmake.org/cmake/help/latest/command/find_library.html
六、target_link_libraries 命令設(shè)置鏈接函數(shù)庫
target_link_libraries 命令的作用是為目標(biāo)函數(shù)庫添加需要鏈接的函數(shù)庫 ;
目標(biāo)函數(shù)庫 : 就是在 Java / Kotlin 代碼中使用 System.loadLibrary(“native-lib”) 加載的動態(tài)庫 , 這是整個 C/C++ 代碼的調(diào)用入口 ;
鏈接多個函數(shù)庫 : 指定 CMake 應(yīng)該連接到目標(biāo)函數(shù)庫的若干函數(shù)庫. 可以鏈接多個函數(shù)庫, 如使用的 Android NDK 函數(shù)庫, 預(yù)編譯的第三方函數(shù)庫, 系統(tǒng)庫等.
鏈接函數(shù)庫命令參數(shù)說明 :
- 參數(shù) 1 : 本構(gòu)建腳本要生成的動態(tài)庫目 標(biāo)
- 參數(shù) 2 ~ … : 后面是之前預(yù)編譯的動態(tài)庫或靜態(tài)庫 , 或引入的動態(tài)庫
官方文檔 : https://cmake.org/cmake/help/latest/command/target_link_libraries.html
Kotlin 中的加載動態(tài)庫 : 與 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(): Stringcompanion object {// Used to load the 'native-lib' library on application startup.init {System.loadLibrary("native-lib")}} }七、CMakeLists.txt 詳細(xì)中文注釋
下面就是自動生成的 CMake 配置文件 , 我添加中文注釋 :
# 指定 CMake 最低版本 cmake_minimum_required(VERSION 3.10.2)# 聲明項目并為項目命名. project("cmake")# 創(chuàng)建函數(shù)庫并為函數(shù)庫命名. # 函數(shù)庫類型 : 設(shè)置該函數(shù)庫的類型 ① 靜態(tài)庫 STATIC ② 動態(tài)庫 SHARED. # 相對路徑 : 指定源碼路徑, 注意是相對路徑. # 函數(shù)庫個數(shù)據(jù) : 可以定義多個函數(shù)庫, CMake 會負(fù)責(zé)構(gòu)建這些函數(shù)庫. # 動態(tài)庫打包 : Gradle 會自動將動態(tài)庫打包到 APK 安裝包中.add_library( # 參數(shù) 1 : 設(shè)置生成的動態(tài)庫名稱.native-lib# 參數(shù) 2 : 設(shè)置生成的函數(shù)庫類型 : ① 靜態(tài)庫 STATIC ② 動態(tài)庫 SHARED.SHARED# 參數(shù) 3 : 配置要編譯的源文件.native-lib.cpp )# 搜索存儲 : 搜索指定的預(yù)編譯庫, 并存儲該預(yù)編譯庫的路徑到變量中, 這里存儲到了 log-lib 變量中. # 指定庫名稱 : CMake 的搜索路徑默認(rèn)包含了系統(tǒng)庫, 只需要指定想添加的公共 NDK 庫的名稱即可, 這里指定 log 即可. # 不需要指定 log 庫的完整路徑 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so. # 驗證存在性 : 在完成編譯之前, CMake 會驗證該函數(shù)庫是否存在.# 到預(yù)設(shè)的目錄查找 log 庫 , 將找到的路徑賦值給 log-lib # 這個路徑是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so # 不同的 Android 版本號 和 CPU 架構(gòu) 需要到對應(yīng)的目錄中查找 , 此處是 29 版本 32 位 ARM 架構(gòu)的日志庫find_library( # 設(shè)置保存函數(shù)庫路徑的變量名稱.log-lib# 指定 CMake 想要定位的 NDK 庫名稱log )# 指定 CMake 應(yīng)該連接到目標(biāo)函數(shù)庫的若干函數(shù)庫. # 可以鏈接多個函數(shù)庫, 如使用的 Android NDK 函數(shù)庫, 預(yù)編譯的第三方函數(shù)庫, 系統(tǒng)庫等. # 鏈接函數(shù)庫 # 參數(shù) 1 : 本構(gòu)建腳本要生成的動態(tài)庫目 標(biāo) # 參數(shù) 2 ~ ... : 后面是之前預(yù)編譯的動態(tài)庫或靜態(tài)庫 , 或引入的動態(tài)庫target_link_libraries( # 指定目標(biāo)函數(shù)庫.native-lib# 鏈接目標(biāo)庫到 NDK 中包含的日志庫.${log-lib} )總結(jié)
以上是生活随笔為你收集整理的【CMake】Android Studio 中使用 CMake 编译单个 C++ 源文件 ( 常用的 CMake 命令解析 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【CMake】CMake 引入 ( An
- 下一篇: s3c2440移植MQTT