日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【CMake】Android Studio 中使用 CMake 编译单个 C++ 源文件 ( 常用的 CMake 命令解析 )

發(fā)布時間:2025/6/17 c/c++ 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【CMake】Android Studio 中使用 CMake 编译单个 C++ 源文件 ( 常用的 CMake 命令解析 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、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 : 配置要編譯的源文件.

# 創(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 )

官方文檔地址 : 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)庫
# 指定 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} )

官方文檔 : 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。