如何为x86_64系统编译带可选TensorFlow Ops的TensorFlow Lite?
我来分享下我成功用Bazel为arm64和x86_64架构构建支持原生TensorFlow Ops的TensorFlow Lite库的经验,还有你遇到的运行时找不到.so文件的解决方案:
一、用Bazel构建带Flex Delegate的TensorFlow Lite库
要让TFLite支持原生TensorFlow Ops,核心是启用Flex Delegate,下面是针对两种架构的具体构建步骤:
1. 前置准备
- 确保安装了对应版本的Bazel:TensorFlow的版本和Bazel版本有严格的适配要求,建议参考TensorFlow官方文档确认匹配的版本。
- 拉取TensorFlow官方源码并进入根目录。
2. 配置编译环境
运行配置脚本./configure,根据你的需求选择:
- 针对x86_64架构:大部分选项可以直接按回车使用默认值,无需额外交叉编译配置。
- 针对arm64架构:如果在x86机器上交叉编译,在脚本提示时选择开启交叉编译,指定目标架构为arm64并设置对应工具链路径;如果是在arm64机器上直接构建,配置流程和x86_64一致。
3. 执行Bazel构建命令
x86_64架构(CPU版本)
bazel build --config=monolithic --define=with_select_tf_ops=true -c opt //tensorflow/lite:libtensorflowlite.so
如果需要静态库,只需把目标替换为//tensorflow/lite:libtensorflow-lite.a即可。
arm64架构
- 直接在arm64机器上构建:使用和x86_64完全一致的命令。
- 在x86机器上交叉编译:添加arm64专属配置参数:
bazel build --config=monolithic --define=with_select_tf_ops=true -c opt --config=linux_arm64 //tensorflow/lite:libtensorflowlite.so
参数说明
--config=monolithic:启用单块构建模式,将所有依赖打包进一个独立库,避免依赖分散导致的加载问题。--define=with_select_tf_ops=true:开启Flex Delegate,让TFLite具备原生TensorFlow Ops的支持能力。-c opt:启用优化编译,大幅提升库的运行性能。
二、解决运行时找不到
libtensorflowlite.so的问题 你提到同目录下其他.so文件能正常加载,但这个库不行,大概率是系统库加载路径的配置问题,试试下面的解决方案:
1. 临时指定库加载路径
运行应用前,先设置LD_LIBRARY_PATH环境变量,让系统优先在当前目录查找依赖库:
export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH ./myapp
2. 永久解决方法
方法一:将库放入系统标准库目录
把编译好的libtensorflowlite.so复制到系统标准库目录(比如/usr/local/lib),然后更新系统库缓存:
sudo cp libtensorflowlite.so /usr/local/lib/ sudo ldconfig
方法二:编译应用时绑定运行时库路径
在编译你的应用时,添加-Wl,-rpath='$ORIGIN'链接参数,让应用自动在自身所在目录查找依赖库:
g++ your_app.cpp -o myapp -L. -ltensorflowlite -Wl,-rpath='$ORIGIN'
3. 额外排查要点
- 检查库的依赖链:用
ldd libtensorflowlite.so查看库本身是否依赖其他未加载的库,如果有,需要将对应依赖库也放到可访问路径。 - 确认架构匹配:用
file libtensorflowlite.so查看库的架构信息,确保和你的应用编译时使用的架构完全一致(比如都是x86_64或arm64)。 - 修正文件权限:确保
libtensorflowlite.so具备可读权限,执行chmod 644 libtensorflowlite.so即可修正。
另外补充一点:因为你构建的库已经集成了Flex Delegate,所以代码里不需要像其他委托类型那样显式创建和安装实例,解释器会在运行时自动启用该委托,这和官方文档的描述一致。
内容的提问来源于stack exchange,提问作者DocDriven
相关产品推荐
相关产品推荐

