在出现错误 "undefined reference to `ruy::ScopedSuppressDenormals" 的 C++ 项目 CMakeLists.txt 中包含 tensorflow lite 库

Include tensorflow lite libraries in CMakeLists.txt of C++ project giving errors "undefined reference to `ruy::ScopedSuppressDenormals"

我正在尝试将 TensorFlow lite 库包含在 C++ 项目的 CMakeLists.txt 中。我遵循了 https://www.tensorflow.org/lite/guide/build_cmake

中的说明
  1. git clone https://github.com/tensorflow/tensorflow.git tensorflow_src
  2. mkdir tflite_build && cd tflite_build
  3. cmake ../tensorflow_src/tensorflow/lite -DTFLITE_ENABLE_XNNPACK=OFF -DTFLITE_ENABLE_EXTERNAL_DELEGATE=OFF TFLITE_ENABLE_RUY=ON/OFF (tried both option)
  4. cmake --build . --config release -j24

并将所有库添加到 CmakeLists.txt 文件中,如下所示

cmake_minimum_required(VERSION 3.0.0)
project(main)

set(TENSORFLOW_SRC_DIR "test_cpp/tensorflow_src")
set(TFLITE_DIR "test_cpp/tflite_build")

find_package(OpenCV 4 REQUIRED)

file(GLOB SOURCE_FILES src/*.cpp  src/*.h )
message(${SOURCE_FILES})
add_executable(${CMAKE_PROJECT_NAME} ${SOURCE_FILES})

include_directories(
    ${TENSORFLOW_SRC_DIR}
    ${TFLITE_DIR}/eigen
    ${TFLITE_DIR}/neon2sse
    ${TFLITE_DIR}/abseil-cpp
    ${TFLITE_DIR}/farmhash/src
    ${TFLITE_DIR}/flatbuffers/include
    ${TFLITE_DIR}/gemmlowp/public
    ${TFLITE_DIR}/gemmlowp
    ${TFLITE_DIR}/ruy
    ${TFLITE_DIR}/cpuinfo/include
)

target_link_libraries(
    ${CMAKE_PROJECT_NAME} PUBLIC
    ${OpenCV_LIBS}

    ${TFLITE_DIR}/_deps/farmhash-build/libfarmhash.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/flags/libabsl_flags_marshalling.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/flags/libabsl_flags_program_name.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/flags/libabsl_flags_reflection.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/flags/libabsl_flags_private_handle_accessor.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/flags/libabsl_flags_config.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/flags/libabsl_flags_internal.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/flags/libabsl_flags_commandlineflag_internal.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/flags/libabsl_flags_commandlineflag.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/flags/libabsl_flags.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/strings/libabsl_cordz_functions.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/strings/libabsl_strings_internal.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/strings/libabsl_cordz_handle.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/strings/libabsl_str_format_internal.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/strings/libabsl_cordz_info.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/strings/libabsl_cord.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/strings/libabsl_cord_internal.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/strings/libabsl_strings.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/container/libabsl_raw_hash_set.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/container/libabsl_hashtablez_sampler.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/synchronization/libabsl_synchronization.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/synchronization/libabsl_graphcycles_internal.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/hash/libabsl_city.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/hash/libabsl_hash.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/hash/libabsl_low_level_hash.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/time/libabsl_civil_time.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/time/libabsl_time_zone.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/time/libabsl_time.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/profiling/libabsl_exponential_biased.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/types/libabsl_bad_optional_access.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/types/libabsl_bad_variant_access.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/numeric/libabsl_int128.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/base/libabsl_raw_logging_internal.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/base/libabsl_throw_delegate.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/base/libabsl_base.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/base/libabsl_log_severity.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/base/libabsl_spinlock_wait.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/base/libabsl_malloc_internal.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/status/libabsl_status.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/debugging/libabsl_stacktrace.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/debugging/libabsl_demangle_internal.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/debugging/libabsl_symbolize.a
    ${TFLITE_DIR}/_deps/abseil-cpp-build/absl/debugging/libabsl_debugging_internal.a
    ${TFLITE_DIR}/_deps/flatbuffers-build/libflatbuffers.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_ctx.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_kernel_avx.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_have_built_path_for_avx512.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_cpuinfo.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_frontend.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_blocking_counter.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_kernel_avx512.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_apply_multiplier.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_block_map.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_trmul.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_kernel_avx2_fma.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/profiler/libruy_profiler_instrumentation.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_denormal.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_prepacked_cache.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_system_aligned_alloc.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_context_get_ctx.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_allocator.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_have_built_path_for_avx2_fma.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_pack_avx.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_wait.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_context.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_pack_avx2_fma.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_thread_pool.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_pack_arm.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_tune.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_kernel_arm.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_have_built_path_for_avx.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_prepare_packed_matrices.a
    ${TFLITE_DIR}/_deps/ruy-build/ruy/libruy_pack_avx512.a
    ${TFLITE_DIR}/_deps/fft2d-build/libfft2d_fftsg.a
    ${TFLITE_DIR}/_deps/fft2d-build/libfft2d_fftsg2d.a
    ${TFLITE_DIR}/_deps/clog-build/libclog.a
    ${TFLITE_DIR}/_deps/cpuinfo-build/libcpuinfo.a
    ${TFLITE_DIR}/libtensorflow-lite.a

    dl
)

它在 windows 机器上工作,但在 Linux 上我收到关于

的错误

对`ruy::ScopedSuppressDenormals::ScopedSuppressDenormals()'的未定义引用

[ 33%] Building CXX object CMakeFiles/main.dir/src/main.cpp.o
[ 66%] Building CXX object CMakeFiles/main.dir/src/ssd_mobilenet_tflite.cpp.o
[100%] Linking CXX executable main
/usr/bin/ld: ../tflite_build/libtensorflow-lite.a(interpreter.cc.o): in function `tflite::Interpreter::Invoke()':
interpreter.cc:(.text+0x3ff): undefined reference to `ruy::ScopedSuppressDenormals::ScopedSuppressDenormals()'
/usr/bin/ld: interpreter.cc:(.text+0x523): undefined reference to `ruy::ScopedSuppressDenormals::~ScopedSuppressDenormals()'
/usr/bin/ld: ../tflite_build/libtensorflow-lite.a(interpreter.cc.o): in function `tflite::Interpreter::Invoke() [clone .cold]':
interpreter.cc:(.text.unlikely+0x5c): undefined reference to `ruy::ScopedSuppressDenormals::~ScopedSuppressDenormals()'
/usr/bin/ld: CMakeFiles/main.dir/src/ssd_mobilenet_tflite.cpp.o: in function `SSD_MOBILENET::loadModel(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
ssd_mobilenet_tflite.cpp:(.text+0x2b2): undefined reference to `tflite::ops::builtin::BuiltinOpResolver::BuiltinOpResolver()'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/main.dir/build.make:231: main] Error 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/main.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

我不想将库添加为指南中给出的“add_subdirectory”,因为它会在我每次创建新项目时编译

那么我该如何解决对`ruy::ScopedSuppressDenormals::ScopedSuppressDenormals()'的未定义引用

更新:

如果我将 CMakeLists.txt 更改为:

cmake_minimum_required(VERSION 3.0.0)
project(main)
set(TENSORFLOW_SRC_DIR "test_cpp/tensorflow_src")
set(TFLITE_DIR "test_cpp/tflite_build")
find_package(OpenCV 4 REQUIRED)
find_package(TFLITE)
file(GLOB SOURCE_FILES src/*.cpp  src/*.h )
message(${SOURCE_FILES})
add_executable(${CMAKE_PROJECT_NAME} ${SOURCE_FILES})
include_directories(
    ${TENSORFLOW_SRC_DIR}
)
target_link_libraries(
    ${CMAKE_PROJECT_NAME} PUBLIC
    ${OpenCV_LIBS}
    ${TFLITE_LIBS}
)

I take this error

from test_cpp/src/main.cpp:1:
test_cpp/tensorflow_src/tensorflow/lite/interpreter_builder.h:26:10: fatal error: flatbuffers/flatbuffers.h: No such file or directory
       26 | #include "flatbuffers/flatbuffers.h"  // from @flatbuffers
          |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~
    compilation terminated.
    make[2]: *** [CMakeFiles/main.dir/build.make:63: CMakeFiles/main.dir/src/main.cpp.o] Error 1
    make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/main.dir/all] Error 2
    make: *** [Makefile:84: all] Error 2

我发现这个 repo 包含项目所需的所有库 https://github.com/muhammedakyuzlu/tflite-cpp-package