【Android筆記】記一次 CMake 構建 Filament Android 庫的完整排錯過程(安卓交叉編譯、CMake、Ninja)

寫在前面的話,為了保持Sceneform-EQR始終是采用最新的filament,每隔一段時間我都會編譯filament,并根據新增內容完善Sceneform-EQR。
在這里插入圖片描述

現由于更換電腦,環境需重新配置。簡單記錄下編譯出錯和解決方式。

Sceneform-EQR 是EQ對谷歌“sceneform-android-sdk”的擴展,適用于圖形和視頻,以及增強現實(AR)和虛擬現實(VR)相關領域。它目前集成了 ARCore、AREngine 和 ORB-SLAM,提供多種場景選項,包括 AR 場景、VR 場景和自定義背景場景,以滿足不同的原生三維開發需求。


filament官方PBR效果演示圖


文章目錄

  • 從坑中走出:一次 CMake 構建 Filament Android 庫的完整排錯過程
    • 一、項目背景與目標
    • 二、構建命令初稿
    • 三、連續踩坑全過程
      • 1. 混用生成器導致緩存沖突
      • 2. source directory 錯誤
      • 3. 找不到 Ninja 和編譯器
      • 4. toolchain 文件語法錯誤
      • 5. CMAKE\_TOOLCHAIN\_FILE 未生效
      • 6. 成功配置但路徑錯亂
    • 四、構建成功后的目錄結構
    • 五、總結與建議
    • 六、參考文檔

從坑中走出:一次 CMake 構建 Filament Android 庫的完整排錯過程

本文將詳細記錄我在構建 Google Filament Android 庫的過程中,遇到的各種 CMake 報錯與環境配置問題,以及逐一解決的思路與方法,希望對使用 CMake 構建跨平臺 C++ 工程的你有所幫助。


一、項目背景與目標

Filament 是 Google 開源的跨平臺實時渲染引擎,廣泛用于安卓、高性能圖形渲染、AR/VR 等領域。

我的目標是:

  • 編譯出適用于 Android 平臺的 aarch64 架構的 Filament 動態鏈接庫(如 libfilament.so);
  • 使用官方提供的 CMake toolchain 文件進行交叉編譯;
  • 最終產出可用于 Android 應用集成的 .so 動態庫及頭文件。

二、構建命令初稿

初始的構建命令如下(位于 filament-1.53.4/out/cmake-android-release-aarch64 目錄):

cmake ^-G Ninja ^-DCMAKE_BUILD_TYPE=Release ^-DCMAKE_INSTALL_PREFIX=..\android-release\filament ^-DCMAKE_TOOLCHAIN_FILE=..\..\build\toolchain-aarch64-linux-android.cmake ^..\..

期望:

通過這個命令使用 Ninja 生成 Android 用的 Makefile 構建配置,并交叉編譯出適用于 ARM64 的 Android 庫。


三、連續踩坑全過程

1. 混用生成器導致緩存沖突

錯誤信息:

CMake Error: Error: generator : NMake Makefiles
Does not match the generator used previously: Visual Studio 17 2022

原因分析:此前使用過 Visual Studio 構建,并在相同的輸出目錄下(如 out/cmake-release)使用了不同的構建生成器。

解決方法

  • 刪除緩存:
rd /s /q CMakeCache.txt CMakeFiles
  • 或者換一個新的構建輸出目錄(推薦):
mkdir out/cmake-android-release-aarch64
cd out/cmake-android-release-aarch64

2. source directory 錯誤

錯誤信息:

CMake Error: The source directory "/" does not appear to contain CMakeLists.txt.

原因分析
命令行中沒有指定有效的源碼目錄,或者路徑拼接出現問題導致 ..\.. 被誤解釋為 /

解決方法
確保當前目錄是 filament/out/cmake-android-release-aarch64,并用相對路徑指向 filament 根目錄:

cmake ..\..  # 即指向 filament 根目錄

3. 找不到 Ninja 和編譯器

錯誤信息:

CMake was unable to find a build program corresponding to "Ninja"
CMAKE_C_COMPILER not set, after EnableLanguage

原因分析

  • 本機未正確安裝 Ninja;
  • 或者 PATH 中未包含 Ninja 可執行路徑;
  • Toolchain 設置未正確配置 NDK 和交叉編譯工具。

解決方法

  • 下載 Ninja 并加入環境變量(推薦使用官方預編譯);
  • 確保你的 NDK 路徑設置正確,并傳遞給 toolchain 文件;
  • 也可以使用 ANDROID_NDKANDROID_TOOLCHAIN 顯式指定編譯工具。

4. toolchain 文件語法錯誤

錯誤信息:

file FILE([TO_CMAKE_PATH|TO_NATIVE_PATH] path result) must be called with exactly three arguments
list GET given empty list
get_filename_component called with incorrect number of arguments

原因分析
說明你傳入的 NDK 路徑、TOOLCHAIN 或系統路徑變量未被正確設置,導致 CMake 腳本中的變量為空。

解決方法
檢查 toolchain-aarch64-linux-android.cmake 中前幾行,是否讀取了環境變量如:

file(TO_CMAKE_PATH "$ENV{ANDROID_NDK}" ANDROID_NDK)

此處 $ENV{ANDROID_NDK} 為空,后續 list/get_filename_component 就會失敗。

建議

  • 設置環境變量:
set ANDROID_NDK=C:\Android\sdk\ndk\25.1.8937393
  • 或者手動替換 toolchain 中的相關行,直接寫死路徑調試。

5. CMAKE_TOOLCHAIN_FILE 未生效

現象描述:

Manually-specified variables were not used by the project:CMAKE_TOOLCHAIN_FILE

原因分析
你可能在已有的 CMake 緩存目錄中重新執行構建命令,但 CMake 不會重新讀取 CMAKE_TOOLCHAIN_FILE,因為該值只在第一次 configure 時生效。

解決方法
刪除緩存后重新 configure:

rd /s /q CMakeCache.txt CMakeFiles

6. 成功配置但路徑錯亂

構建路徑:

D:\filament-1.53.4\out\cmake-release\out\cmake-android-release-aarch64

原因分析
你在 out/cmake-release 中再次 cd out/cmake-android-release-aarch64,導致路徑變成 out/cmake-release/out/cmake-android-release-aarch64,路徑層級錯誤。

建議
統一使用清晰路徑:

D:\filament-1.53.4\out\cmake-android-release-aarch64

四、構建成功后的目錄結構

配置成功后,會看到類似如下結構:

out/
├── cmake-android-release-aarch64/
│   ├── CMakeFiles/
│   ├── build.ninja
│   ├── lib/
│   │   ├── libfilament.so
│   │   └── ...
│   └── ...
└── android-release/└── filament/├── include/└── lib/

執行構建命令:

ninja
ninja install

五、總結與建議

問題類型關鍵點建議
生成器沖突混用了 NMake / Ninja / Visual Studio每次構建新平臺前清理緩存
Ninja 未安裝構建器不可用下載并配置環境變量
NDK 未配置toolchain 報錯設置 ANDROID_NDK 環境變量或寫死路徑
toolchain 變量為空list/get_filename 錯誤打印調試變量確認路徑是否為空
CMAKE_TOOLCHAIN_FILE 未生效被緩存忽略刪除 CMakeCache.txt 重新生成
路徑錯亂輸出路徑嵌套混亂使用絕對路徑或統一的輸出目錄結構

六、參考文檔

  • Filament 官方文檔
  • CMake Toolchain 配置指南
  • Ninja 官方地址
  • CMake 常見報錯解讀與解決方案

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87026.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ARM 單片機定義變量絕對地址方法

在ARM單片機中,定義變量到絕對地址通常有以下幾種方法(以Keil MDK為例,其他工具鏈原理類似): 方法1:使用指針強制轉換(通用) 直接通過指針訪問指定地址: define REGIS…

為何AI推理正推動云計算從集中式向分布式轉型

作者簡介:Vineeth Varughese是Akamai亞太及日本地區的云產品市場負責人,在云計算、人工智能(AI)及市場進入策略(GTM)領域擁有豐富經驗。 傳統云平臺在利用海量數據訓練AI模型方面表現出色,但隨著…

ar 導航導覽技術如何實現的?室內外融合定位與ar渲染技術深度解析

本文面向:移動開發工程師、AR技術研究者、室內外導航系統產品經理,旨在提供核心問題的參考方案:如何實現室內外無縫切換的精準定位(GPS藍牙Beacon)虛擬導航路徑與實景畫面的實時疊加原理。 如需獲取ar導航導航技術解決…

電路問題處理:SGMII鏈路中的AC耦合電容擺放位置

SGMII鏈路中的AC耦合電容擺放位置 目前是有個板子,其上分別有fpga,fpga的gtx口出sgmii千兆以太網鏈路,通過高速連接器互聯, 通常高速差分鏈路的AC耦合電容放在靠近接收端位置,如果在同一個板內的話沒啥疑惑的直接靠近…

激光雷達 + 視覺相機:高精度位姿測量方案詳解

激光雷達 視覺相機:高精度位姿測量方案詳解 引言 在航天器交會對接、自動駕駛、機器人導航等領域,位姿(位置姿態)測量的精度和魯棒性至關重要。單一的傳感器(如激光雷達或視覺相機)往往難以滿足復雜場景的…

【整數遞增加法拆分】2022-4-11

緣由整數拆分問題,但是怎么輸出這個數位最多。-編程語言-CSDN問答 void 整數遞增加法拆分() {//緣由https://ask.csdn.net/questions/7687667?spm1005.2025.3001.5141int n 0, c 1, f c, t n;string sc "";cin >> n; t n;while (t){if (t &…

Hashcat使用教程:快速上手密碼恢復工具

在信息安全領域,密碼破解是不可或缺的一環。而 Hashcat,作為當前最強大的密碼恢復工具之一,因其高效的性能與靈活的配置廣受好評。本文將介紹 Hashcat 的基礎用法,幫助新手快速上手,同時遵守合法使用的基本原則。 一、…

萌系盲盒陷維權風暴,Dreams委托David律所已立案,速避雷

美國律所David代理Dreams USA, Inc.發起全新維權案件,維權矛頭指向旗下三大萌系盲盒品牌:Sonny Angel、SMISKI和HIPPERS,跨境賣家需提高警惕。 案件基本情況: 起訴時間:2025-6-9 案件號:2025-cv-06422 …

aflplusplus:開源的模糊測試工具!全參數詳細教程!Kali Linux教程!(三)

使用 afl-cc 這是 afl-fuzz 的輔助應用程序。它可以作為 gcc 和 clang 的直接替代品,讓您使用所需的運行時工具重新編譯第三方代碼。 1. -help 顯示可用選項 afl-cc -help 其他選項同上,這里不再展開敘述。 afl-clang 1. --help 顯示可用選項 a…

安卓開發常用框架與庫詳解

安卓開發常用框架與庫詳解 安卓應用開發過程中,選擇合適的開發框架和第三方庫,可以極大提升開發效率、應用性能和代碼的可維護性。本文對主流的安卓開發框架和庫進行系統梳理,按功能模塊分類,涵蓋UI開發、網絡請求、圖片加載、數…

【項目實訓#09】智能代碼文件助手模式前后端設計與實現

【項目實訓#09】智能代碼文件助手模式前后端設計與實現 文章目錄 【項目實訓#09】智能代碼文件助手模式前后端設計與實現一、背景簡介二、技術方案與架構設計2.1 整體架構2.2 前端技術選型2.3 后端技術選型 三、前端代碼替換服務實現3.1 代碼替換服務設計3.2 處理生成的代碼3.3…

JAVA-springboot 異常處理

SpringBoot從入門到精通-第10章 異常處理 一、異常簡介 傳統的Java程序都是由try-catch語句捕捉異常,而Spring Boot項目采用了全局異常類的概念------所有方法均將異常拋出,并且專門安排一個類統一攔截并處理這些異常。這樣做的好處是可以把異常處理的…

VIC-3D應用指南系列之:DIC數字圖像相關技術與熱成像(VIC-3D IR System助力熱載荷測試)

本篇文章詳細講述了利用VIC-3D 10將數字圖像相關DIC數據與紅外相機熱成像的溫度數據相結合的操作流程。核心步驟包括: 相機選型與系統搭建 測試環境配置 VIC-Snap參數設置 雙系統標定(DIC與紅外) 外部參數計算 測試圖像采集 紅外…

adoc(asciidoc)轉為markdown的方法,把.adoc文件轉換為markdown格式

要將.adoc文件轉換為markdown格式,可以按照以下步驟操作: 安裝必要工具: sudo apt install pandoc asciidoc轉換流程: 先將asciidoc轉換為docbook格式: asciidoc -b docbook foo.adoc然后將docbook轉換為markdown&…

2022mpsPTE崗位筆試題

2022年9月完成了PTE崗位的筆試,并通過了。淺淺的還有一點印象,之前有朋友也想來,就放在這里,供需要的朋友看。 前兩個題是關于C語言的。 語言不限,C也可。 一個是輸出2到100偶數之和,主要就是調用for循環。…

使用Cursor + Devbox + Uniapp 一站式AI編程開發移動端(App、H5、小程序)

文章目錄 前言📖一、工具介紹🛠?1. Cursor:AI驅動的智能代碼編輯器2. Devbox:可復現的開發環境管理3. Uniapp:跨平臺應用開發框架 二、環境配置與集成🔮1. 安裝與配置Devbox2. 配置Cursor連接Devbox環境3.…

[智能客服project] AI提示詞配置 | 主協調器 | 閑魚協議工具

第五章:AI提示詞配置 歡迎回來! 在第四章:意圖路由器中,我們了解了機器人如何通過IntentRouter確定由哪個專家代理(如PriceAgent或TechAgent)處理用戶消息。 但代理被選定后,如何知道該說什么…

CMake 構建系統概述

關鍵要點 研究表明,CMake 是一種強大的跨平臺構建系統,廣泛用于 C 項目。證據傾向于認為,CMake 通過生成本地構建文件(如 Makefile、Visual Studio 項目)簡化軟件構建。它似乎可能支持多種平臺,包括 Windo…

如何順利將電話號碼轉移到新iPhone?

當您升級到新 iPhone 時,您需要做的第一件事就是轉移您的電話號碼。幸運的是,以目前的技術,很容易解決如何將電話號碼轉移到新iPhone上。此外,傳輸過程也得到了簡化。您可以輕松地將舊手機更換為新 iPhone,而不會丟失任…

java面試總結-20250609

DDD領域設計模型怎么理解? mysql和mongoDB分別適用于哪些業務場景? 查詢的場景,數量級的差異? mongodb為什么用B樹?用的什么數據引擎,部署方式使用什么模式,分片分了多少片,路由方…