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