1.project函數(shù)
project(xrbodyfaceeyesocial)
xrbodyfaceeyesocial 指定了項(xiàng)目的名稱。之后在 CMake 文件中使用 ${PROJECT_NAME} 變量時(shí),
會(huì)被替換為 xrbodyfaceeyesocial。
2.file函數(shù)
file 是 CMake 中的一個(gè)命令,用于執(zhí)行與文件相關(guān)的操作,比如查找、創(chuàng)建、刪除文件等。
file(GLOB_RECURSE SRC_FILES
Src/*.c
Src/*.cpp
)
GLOB_RECURSE: 這是 file 命令的一種模式,表示遞歸地查找指定目錄下的文件。GLOB_RECURSE 會(huì)深入子目錄查找。
SRC_FILES :是一個(gè)變量,用于存儲(chǔ)找到的文件列表。
Src/.c
Src/.cpp
表示搜索的目錄文件
3.add_library 函數(shù)
add_library(${PROJECT_NAME} MODULE ${SRC_FILES})
add_library:這是 CMake 中用于創(chuàng)建庫的命令。它用于定義庫的類型和包含的源文件。
${PROJECT_NAME}:這是一個(gè)變量,用于表示當(dāng)前項(xiàng)目的名稱。在代碼的開頭部分已經(jīng)通過 project(xrbodyfaceeyesocial) 定義了這個(gè)名稱,因此在這里它會(huì)被替換為 xrbodyfaceeyesocial。
MODULE:這是指定庫的類型。CMake 支持幾種類型的庫,包括:
STATIC:靜態(tài)庫
SHARED:共享庫
MODULE:模塊庫(通常用于動(dòng)態(tài)加載的插件)。在這里,MODULE 類型表示這個(gè)庫不會(huì)被鏈接到其他目標(biāo),而是可以在運(yùn)行時(shí)被動(dòng)態(tài)加載。
${SRC_FILES}:這是指定要包含在構(gòu)建庫中的源文件列表。file(GLOB_RECURSE ...) 指令在之前的代碼中定義了這個(gè)變量,它包含了所有在 Src 目錄下的 .c 和 .cpp 文件。
4. target_include_directories 函數(shù)
target_include_directories(${PROJECT_NAME} PUBLIC ${ANDROID_NDK}/sources/android/native_app_glue)
target_include_directories: 這是 CMake 的一個(gè)命令,用于為指定的目標(biāo)(此處是 ${PROJECT_NAME})設(shè)置包含目錄。包含目錄是編譯時(shí)需要查找頭文件的路徑。
${PROJECT_NAME}: 這個(gè)變量是之前在 CMake 文件中定義的項(xiàng)目名稱,在此處它被替換為實(shí)際的項(xiàng)目名(在上下文中是 xrbodyfaceeyesocial)。這意味著該命令將應(yīng)用于這個(gè)特定的目標(biāo)。
PUBLIC: 這是一個(gè)作用域參數(shù),表示所添加的包含目錄對(duì)指定目標(biāo)和鏈接到該目標(biāo)的其他目標(biāo)都是可見的。換句話說,任何依賴于 ${PROJECT_NAME} 的目標(biāo)也能訪問到這個(gè)包含目錄。
${ANDROID_NDK}: 這是一個(gè) CMake 變量,通常是 Android NDK 的安裝目錄路徑。NDK(Native Development Kit)是 Android 的原生開發(fā)工具包,支持 C/C++ 開發(fā)。
/sources/android/native_app_glue: 這是相對(duì)于 ANDROID_NDK 的路徑,指向 Android NDK 中的 native_app_glue 目錄。這個(gè)目錄包含 Android Native Activity 的應(yīng)用程序粘合層的源代碼,用于簡化 Android 應(yīng)用程序的開發(fā)。
5. target_link_libraries 函數(shù)
target_link_libraries(${PROJECT_NAME} PRIVATE
android
EGL
GLESv3
log
ktx
)
這段代碼是 CMake 構(gòu)建系統(tǒng)中的一部分,用于指定目標(biāo)文件(target)鏈接所需的庫。我們逐步分解并詳細(xì)解釋每個(gè)部分。
target_link_libraries:
這是 CMake 中的一個(gè)命令,作用是為指定的目標(biāo)鏈接一個(gè)或多個(gè)庫。它可以用來聲明目標(biāo)與外部庫之間的依賴關(guān)系。
${PROJECT_NAME}:
這是一個(gè)變量,代表項(xiàng)目的名稱。在之前的 CMake 文件中,這個(gè)變量通過 project(xrbodyfaceeyesocial) 被定義。這樣,${PROJECT_NAME} 解析為 xrbodyfaceeyesocial。
PRIVATE:
這是一個(gè)可見性標(biāo)志,指定鏈接的庫的可見性。在這里,PRIVATE 表示被鏈接的庫僅在當(dāng)前目標(biāo)(即 ${PROJECT_NAME})中可見,而不會(huì)傳播給依賴于該目標(biāo)的其他目標(biāo)。
android, EGL, GLESv3, log, ktx:
這些是鏈接到項(xiàng)目中的具體庫名稱:
android: Android 平臺(tái)的基本庫,提供 Android 應(yīng)用程序所需的功能。
EGL: 一個(gè)接口,用于管理 OpenGL 渲染上下文和顯示表面,這對(duì)圖形渲染至關(guān)重要。
GLESv3: OpenGL ES 3.0 是專為嵌入式系統(tǒng)(如移動(dòng)設(shè)備)設(shè)計(jì)的圖形 API。
log: 用于在 Android 應(yīng)用中進(jìn)行日志記錄的庫。
ktx: KTX(Khronos Texture)是用于高效紋理壓縮和存儲(chǔ)的庫。
6.set_target_properties 函數(shù)
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "-u ANativeActivity_onCreate")
這行代碼的作用是為指定的目標(biāo)(在這里是 ${PROJECT_NAME})設(shè)置屬性,具體來說,是設(shè)置鏈接時(shí)的標(biāo)志。
分解解釋:
set_target_properties:
這是一個(gè) CMake 命令,用于設(shè)置某個(gè)目標(biāo)的屬性。目標(biāo)可以是庫、可執(zhí)行文件等。
${PROJECT_NAME}:
這是一個(gè)變量,它在項(xiàng)目的開頭被定義為 xrbodyfaceeyesocial。在此命令中,使用了這個(gè)變量來指定需要設(shè)置屬性的具體目標(biāo)。
PROPERTIES:
這是 set_target_properties 命令的一個(gè)參數(shù),用于指明后面將要設(shè)置的屬性類型。
LINK_FLAGS:
這個(gè)屬性用于指定在鏈接時(shí)應(yīng)使用的標(biāo)志或選項(xiàng)。在此處,LINK_FLAGS 的設(shè)置影響鏈接器(linker)的行為。
"-u ANativeActivity_onCreate":
這是一個(gè)鏈接器標(biāo)志的具體值。-u 是鏈接器參數(shù)的一個(gè)選項(xiàng),意味著“強(qiáng)制引用”。在這里,它表示強(qiáng)制引用 ANativeActivity_onCreate 函數(shù),這個(gè)函數(shù)是安卓 NDK(Native Development Kit)中的一個(gè)入口點(diǎn)。通過強(qiáng)制引用,鏈接器會(huì)確保這個(gè)函數(shù)被包含在最終的可執(zhí)行文件中,即使在代碼中沒有直接使用它。