编译tensorflowlite

吐槽

处于一些原因需要自己编译一下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了,至少通过了编译。不过后面会不会有什么隐患就未知了。

如此就完成了,这样说来还算是顺利的。


编译tensorflowlite
https://www.wuzeyu.site/2025/10/04/编译tensorflowlite/
作者
吴泽雨
发布于
2025年10月4日
许可协议