【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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树?用的什么数据引擎,部署方式使用什么模式,分片分了多少片,路由方…