背景:
我在若干年前,在看一个类似于坦克大战的游戏的时候,
看到了其内部使用了 tf lite 的机器学习库,那个时候,我就对它有点兴趣,
后来由于工作原因,代码忘记了,
直到最近,想做点东西,想把这玩意拿回来,继续搞,开始,我自己编译一套库吧。
这里我只编 _c 的项目,因为我需要用它。
预先安装 VS2022,2019也可以,2017有可能不行。
因为如果用VS系列编译,需要使用一个C++20的新特性,IDE版本太低,可能无法支持。
我这里使用的是 2022。
预先安装 git。
其实,TF lite 的完整编译过程在网上有现成的说明,且是中文的,地址:
https://www.tensorflow.org/lite/guide/build_cmake
但是,编译过程中,可能遇到点问题,这里就简单地说一下。
1:下载 tf lite 代码,简单git 就可以了
git clone https://github.com/tensorflow/tensorflow.git tensorflow_src
2:找个放tf lite 项目的目录,比如,路径叫 lite
然后启动 vs2022 的命令行工具
x64 Native Tools Command Prompt for VS 2022
当然了,用x86版本的也可以,看需求
3:在 vs2022 命令行下,进入lite 目录,
开始编译 tf,
由于我这里要编译的是 _c 库,所以我可以直接指向 c 目录创建项目,具体命令如下
cmake G:/tensorflow_src/tensorflow/lite/c
静待完成即可,缺库,cmake会自己去下库,中间可能要卡很久,因为它在用git 下库。
但是,这里有个很严重的问题是,此目录下的 CMakeList 文件里面有一处代码错误,导致 tensorflowlite_c 项目生成会失败,
具体修复方式是这样的
这逼代码都cc的,弄个 c 的common,啥意思,改完之后,就可以了,
这个文件cmake也会改,但是没关系,不管它即可。
4:前面都做完了,
这里直接编译即可
cmake --build . -j
很简单吧,
5:第一个坑
但是第一次编译肯定是不成功的,
因为它用了一个g++才支持的特殊语法,结构指定成员初始化,
问题出在这里,修改 tf lite 项目的配置,语言标准使用 c++20 ,第一个坑就绕过了。
6:第二个坑,
编译的时候,会出现另一种情况,就是
这是什么鬼,可怜,一点办法都没有,那么这个宏也要改,
重定义一下这个宏,
然后 tf lite 项目即可编过
7:第三个坑
然后编译 tf lite c 项目,可以顺利编译完成,
但是默认配置编译完成的模块,没有函数导出,
原因是 tf lite c 模块中,
静态库的宏,最初是开着的,且没有 _WIN32 的宏,所以需要改项目配置
增加 _WIN32 的宏,关掉静态库的宏,
至此,才算可以一步到位,全部完成。
文件还是不小的,
但是,到这里,可以看到,突然发现的问题是,只有dll,没有头文件,咋整,
其实不用整,
tensorflowlite_c
项目下的 c_api.h 已经把头文件给我整理好了,
只是如果直接用它的话,需要在当前目录下创建个项目,或者将tf 的目录加入 include 目录,否则 tf 的头文件就找不到了,
如果不想这么搞就只能单独扒头文件了,很费事,文件太多,我放弃了,
反正这帮逼都是一个德行,
你编个linux驱动,需要有linux内核,搞个llvm,需要改整个工程,这玩意,可以了。