Cmake 語義學(xué)習(xí)

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í)行文件中,即使在代碼中沒有直接使用它。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容