寫在前面的話,為了保持Sceneform-EQR始終是采用最新的filament,每隔一段時間我都會編譯filament,并根據新增內容完善Sceneform-EQR。
現由于更換電腦,環境需重新配置。簡單記錄下編譯出錯和解決方式。
Sceneform-EQR 是EQ對谷歌“sceneform-android-sdk”的擴展,適用于圖形和視頻,以及增強現實(AR)和虛擬現實(VR)相關領域。它目前集成了 ARCore、AREngine 和 ORB-SLAM,提供多種場景選項,包括 AR 場景、VR 場景和自定義背景場景,以滿足不同的原生三維開發需求。
文章目錄
- 從坑中走出:一次 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_NDK
、ANDROID_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 常見報錯解讀與解決方案