吐槽
处于一些原因需要自己编译一下tensorflow-lite。现在是2025年10月,tensorflow讲道理已经式微了,但是似乎在huggingface上还是有不少新的模型也会提供一个tflite的版本。而且我之前用的mediapipe中的pose的模型也是tflite的模型。也是离谱,tensoflow官网上关于tflite,大概是说因为是面向移动端的框架,所以并不提供适用于windows等桌面平台的二进制包,所以还需要自己编译。我需要的可以在C中调用的dll,网上资源也不多,因为大家大多都是直接用python模块了。还好官方提供了构建方式https://tensorflow.google.cn/lite/guide/build_cmake。照着做就行了,也懒得用官方力推的bazel工具构建了。
操作
首先是cmake ../tensorflow_src/tensorflow/lite/c
唯一的问题在于,cmake会再一次从github上把源码下载一遍,如果网络不好的话可能会很慢。可以添加类似这样的参数-DTENSORFLOW_SOURCE_DIR=D:/src/tensorflow,让它不用再下载了。不过后面好像还是会下载其他的依赖。似乎还有一个要从谷歌的服务器上下载,还需要特殊的网络环境和一些设置。依赖还挺多的,下了大半天。
然后是正式开始编译cmake --build . -j,这个要稍微等一会。
我这里出现的问题是model_building.h这个文件中,具体代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class [[nodiscard]] Buffer { public: static constexpr const BufferIdx kNoBuffer{-1};
Buffer(const Buffer&) = default; Buffer& operator=(const Buffer&) = default;
private: Buffer(InterpreterInfo* builder, BufferIdx buffer_idx) : builder_(builder), buffer_idx_(buffer_idx) {}
friend class Helper; friend class Tensor;
InterpreterInfo* builder_; BufferIdx buffer_idx_; };
class [[nodiscard]] Tensor { public: Tensor(const Tensor&) = default; Tensor& operator=(const Tensor&) = default;
explicit Tensor(Buffer buffer) : builder_(buffer.builder_) {}
private: Tensor() = default; Tensor(InterpreterInfo* builder, TensorIdx tensor_idx, GraphIdx graph_idx) : builder_(builder), tensor_idx_(tensor_idx), graph_idx_(graph_idx) {}
friend class Helper; template <size_t count> friend std::array<Tensor, count> NewInputs(Graph graph, TfLiteType type);
InterpreterInfo* builder_; TensorIdx tensor_idx_{-1}; GraphIdx graph_idx_{-1}; };
|
这里编译器死活说Tensor里面这句explicit Tensor(Buffer buffer) : builder_(buffer.builder_) {}无法访问buffer的private成员,命名Buffer里面已经把Tensor设置为友元了,不应该吧。
最后我懒得死磕,直接把那个成员改成public了,至少通过了编译。不过后面会不会有什么隐患就未知了。
如此就完成了,这样说来还算是顺利的。