Я закончил перечислять все необходимые объектные файлы TFLite вручную для CMake target_link_libraries
(в TFLite_LIBS
), и это работает.
Я использовал простой скрипт оболочки, чтобы получить список необходимых объектных файлов.Сначала я собрал все неопределенные ссылки из журнала сборки в массив bash следующим образом:
SYMBOLS=(\
'tflite::CombineHashes('\
'tflite::IsFlexOp('\
'tflite::ConvertArrayToTfLiteIntArray('\
'tflite::EqualArrayAndTfLiteIntArray('\
...
'tflite::ConvertVectorToTfLiteIntArray(')
Затем для каждого символа в этом массиве я просмотрел каждый файл *.o
в выводе сборки bazel:
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
и добавил вывод к TFLite_LIBS
в CMake (с правильным префиксом пути, конечно).После этого я получил новую порцию неопределенных ссылок, но после нескольких итераций все решилось.
Возможно, я мог бы также получить полный список зависимостей из файла *-params
из моей первоначальной сборки в дереве, но быстрая проверка показала, что в нем были некоторые избыточные элементы, и сценарий собрал только необходимые.
Для местоположений включений я заменил этот жестко закодированный путь к планшетам в кэше базелей на ${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
.