And*_*iad 5 c++ cmake bazel tensorflow tensorflow-lite
通过将源代码添加到,我已经成功构建了一个运行TF Lite模型的简单C ++应用程序tensorflow/lite/examples,这与官方C ++ TF指南建议的完整TF 相似。现在,我想将其构建为一个静态链接到TF Lite的单独项目(共享库),并使用CMake作为构建系统。
我试图向自己添加一个自定义目标CMakeLists.txt,该目标将使用Bazel构建TF Lite:
set(TENSORFLOW_DIR ${CMAKE_SOURCE_DIR}/thirdparty/tensorflow)
add_custom_target(TFLite
COMMAND bazel build //tensorflow/lite:framework
COMMAND bazel build //tensorflow/lite/kernels:builtin_ops
WORKING_DIRECTORY ${TENSORFLOW_DIR})
Run Code Online (Sandbox Code Playgroud)
我之所以选择这些Bazel目标,是因为其中的BUILD文件tensorflow/lite/examples/minimal将它们作为依赖项,并且当我在TF存储库中使用Bazel构建代码时,它们对我有用。不确定是否足够。
然后,我手动收集include dirs(具有丑陋的临时硬编码路径)和libs:
set(TFLite_INCLUDES
${TENSORFLOW_DIR}
~/.cache/bazel/_bazel_azymohliad/ec8567b83922796adb8477fcbb00a36a/external/flatbuffers/include)
set(TFLite_LIBS
${TENSORFLOW_DIR}/bazel-bin/tensorflow/lite/libframework.pic.a)
target_include_directories(MyLib ... PRIVATE ... ${TFLite_INCLUDES})
target_link_libraries(MyLib ... ${TFLite_LIBS})
Run Code Online (Sandbox Code Playgroud)
通过这种配置,我在链接期间获得了许多未定义的对TFLite内容的引用。我检查了nm,这些符号确实在中丢失了libframework.pic.a,我.o在Bazel输出的各种文件中找到了其中的一些。手动选择所有这些.o文件似乎是错误的。
因此,是否可以像我想要的那样从CMake很好地链接到TF Lite?也许有一些神奇的bazel query include_dirs(//tensorflow/lite:framework)命令可以为我提供所有必要的包含目录的路径,以及一个类似的库链接命令,以便我可以将此信息传递给CMake?
我最终为CMake手动列出了所有必需的TFLite对象文件target_link_libraries(在中TFLite_LIBS),它可以工作。
我使用了一个简单的shell脚本来获取必要的目标文件列表。首先,我将构建日志中所有未定义的引用收集到bash数组中,如下所示:
SYMBOLS=(\
'tflite::CombineHashes('\
'tflite::IsFlexOp('\
'tflite::ConvertArrayToTfLiteIntArray('\
'tflite::EqualArrayAndTfLiteIntArray('\
...
'tflite::ConvertVectorToTfLiteIntArray(')
Run Code Online (Sandbox Code Playgroud)
然后对于该数组中的每个符号,我遍历*.o了bazel build输出中的每个文件:
for SYMBOL in $SYMBOLS[@]; do
for OBJ in $(find -L /path/to/tensorflow/bazel-bin/ -name '*.o'); do
nm -C $OBJ | grep "T $SYMBOL" > /dev/null && echo $OBJ
done
done | sort | uniq
Run Code Online (Sandbox Code Playgroud)
并将输出添加到TFLite_LIBSCMake中(当然带有正确的路径前缀)。之后,我得到了未定义引用的新部分,但经过几次迭代,它解决了所有问题。
也许我也可以*-params从我最初的树内构建中从文件中获取依赖项的完整列表,但是快速检查表明它具有一些冗余项,并且脚本仅收集了必要的项。
对于包含位置,我将硬编码路径替换为bazel缓存中的flatbuffers ${TENSORFLOW_DIR}/bazel-tensorflow/external/flatbuffers/include/。感谢jdehesa的提示。
更新:
全包TF Lite静态库的本机构建可以使用普通的旧版本非常类似于RPi,iOS或ARM64的官方构建说明进行:
1. ./tensorflow/lite/tools/make/download_dependencies.sh
2。make -f tensorflow/lite/tools/make/Makefile
输出库将存储为<tensorflow-root>/tensorflow/lite/tools/make/gen/<platform>/lib/libtensorflow-lite.a。外部依赖项及其标头会进入<tensorflow-root>/tensorflow/tensorflow/lite/tools/make/downloads(例如flatbuffers标头在中<tensorflow-root>/tensorflow/tensorflow/lite/tools/make/downloads/flatbuffers/include)。
指南没有提到可以直接调用make。有用于不同交叉编译目标的包装器脚本,它们仅设置适当的变量并运行make。但是默认情况下,make只会执行本机构建。此make发票可以作为中的自定义命令添加CMakeLists.txt。
| 归档时间: |
|
| 查看次数: |
1604 次 |
| 最近记录: |