在libDaisy项目中引入TensorFlow Lite for Microcontrollers遇头文件错误
解决TensorFlow Lite for Microcontrollers在libDaisy项目中的头文件引用问题
问题背景
在基于Electrosmith Daisy Seed(搭载STM32H7 MCU)的libDaisy HAL C++项目中引入TensorFlow Lite for Microcontrollers时,遇到TFLite内部头文件无法被编译器识别的问题。TFLite源码内的头文件均使用tensorflow/lite/micro/xxx.h这类格式引用,但编译器无法解析该路径。手动将引用改为相对路径可解决问题,但涉及数百处修改,工程量过大。
错误示例
DataInference/RainPredictor/../../tensorflow/tensorflow/lite/micro/all_ops_resolver.h:18:10: fatal error: tensorflow/lite/micro/compatibility.h: No such file or directory 18 | #include "tensorflow/lite/micro/compatibility.h" | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
项目结构
libDaisy/ daisySP/ Firmware/ ├── Firmware.cpp ├── tensorflow/ │ └── ... (TensorFlow Lite for Microcontrollers源码文件) ├── DataInference/ │ └── RainPredictor/ │ ├── model.h │ └── rain_predictor.cpp ├── (其他无关文件) └── Makefile
现有Makefile片段
# Project Name TARGET = Firmware # Sources CPP_SOURCES = Firmware.cpp LDFLAGS += -u _printf_float # Library Locations LIBDAISY_DIR = ../libDaisy DAISYSP_DIR = ../DaisySP TENSORFLOW_DIR = ./tensorflow TENSORFLOW_ROOT := ./tensorflow # Core location, and generic makefile. SYSTEM_FILES_DIR = $(LIBDAISY_DIR)/core include $(SYSTEM_FILES_DIR)/Makefile
解决方案
核心思路是通过编译器选项添加头文件搜索路径,让编译器识别TFLite内部的tensorflow/...引用格式,无需修改TFLite源码。
方法1:直接修改Makefile添加包含路径
在现有Makefile的Library Locations代码块后,添加C++编译器的头文件搜索路径配置:
# 添加TensorFlow根目录到头文件搜索路径 CXXFLAGS += -I$(TENSORFLOW_ROOT)/..
或直接指定当前Firmware目录作为搜索路径:
CXXFLAGS += -I./
解释:TFLite内部的头文件引用从tensorflow/目录开始,将该目录的上级目录(即Firmware/)加入搜索路径后,编译器就能正确解析tensorflow/lite/micro/compatibility.h这类路径。
方法2:利用libDaisy通用Makefile的扩展变量
查看libDaisy的core/Makefile是否预留了用户自定义包含路径的变量(如USER_INCLUDES),若存在可直接使用:
USER_INCLUDES += -I./
这种方式更贴合libDaisy项目的构建规范。
优化代码中的头文件引用
完成Makefile配置后,rain_predictor.cpp中的引用可简化为更清晰的形式,无需多级相对路径:
#include "tensorflow/lite/micro/all_ops_resolver.h" #include "tensorflow/lite/micro/micro_interpreter.h" #include "tensorflow/lite/schema/schema_generated.h" #include "model.h"
内容的提问来源于stack exchange,提问作者Max Campbell
相关产品推荐
相关产品推荐

