编译 Xiaomi lavender 的 QCamera2 时找不到头文件如何解决?
数据小陈
结论
QCamera2 编译失败,是因为编译命令没有把 msmb_camera.h 所在目录加入头文件搜索路径。内核源码中有这个文件,Android 构建也不会因此自动搜索整个内核目录。
报错中的代码是:
#include <media/msmb_camera.h>
要让这个包含路径生效,编译器的 -I 搜索目录必须是包含 media/ 子目录的路径。按题目提供的位置,可能的目录是:
kernel/xiaomi/sdm660/include
kernel/xiaomi/sdm660/include/uapi
排查步骤
- 找到实际编译 QCamera2 的构建文件,通常是相关模块的
Android.mk,也可能是 Soong 的Android.bp。 - 查看失败编译命令中的
-I参数,确认是否包含上述目录之一。如果没有,说明该模块没有获得相应的内核头文件搜索路径。 - 判断
msmb_camera.h应使用哪一份。两处都有同名文件,但内容或依赖可能不同。检查 QCamera2 的其他头文件、同一设备树中成功构建的模块,以及内核和设备树是否配套,再决定使用哪一份。 - 在 QCamera2 模块的构建配置中加入选定的 include 目录,然后重新编译。
例如,如果模块使用 Android.mk,且确认应使用 include/media/msmb_camera.h,可以在模块配置中添加:
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/../../../../../../kernel/xiaomi/sdm660/include
示例中的相对路径取决于 Android.mk 所在位置,需要根据实际目录结构调整。如果确认需要 include/uapi/media/msmb_camera.h,则应将路径指向 kernel/xiaomi/sdm660/include/uapi。
对于 Soong 模块,可以在 Android.bp 的模块配置中使用适合该目录结构的 local_include_dirs 或 include_dirs。具体写法和路径基准取决于模块类型及构建树布局。
注意事项
不要因为两份文件都存在,就把两个目录一并加入,也不要直接修改全局编译参数。先确认模块需要哪份头文件,并检查新增目录中相关头文件的依赖是否也能解析。如果编译器随后报告其他头文件缺失,再根据报错补齐该模块需要的依赖路径,并确保内核源码与设备树版本匹配。
题目没有提供 device tree、kernel source 的具体内容或完整编译命令,因此无法确定应选用哪份头文件,也无法给出可直接套用的精确相对路径。检查最终编译命令中的 -I 参数,可以确认构建配置是否生效。
备注:内容仅供参考。
