Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wangjia184/27d02d50906641b7463b67107e1622ba to your computer and use it in GitHub Desktop.
Save wangjia184/27d02d50906641b7463b67107e1622ba to your computer and use it in GitHub Desktop.
#Prerequisite
* Tensorflow Version : 2.10. Pull source code from `https://github.com/tensorflow/tensorflow/tree/r2.10`. `r2.10` is preferred branch.
* Python 3.10
* `pip3 install numpy`
* CMake
Official instructions can be found at : https://www.tensorflow.org/lite/guide/build_cmake#build_tensorflow_lite_c_library
# Fix bug in CMakeLists.txt
Open `tensorflow\lite\c\CMakeLists.txt`, search `common.c` and replace it with `common.cc`
```
add_library(tensorflowlite_c ${TFLITE_C_LIBTYPE}
builtin_op_data.h
common.h
common.cc
c_api_types.h
c_api.h
c_api.cc
c_api_experimental.h
c_api_experimental.cc
c_api_internal.h
)
```
If you don't fix this bug, it would fail with the following error when generating build scripts.
```
CMake Error at CMakeLists.txt:63 (add_library): Cannot find source file:
common.c
Tried extensions .c .C .c++ .cc .cpp .cxx .cu .mpp .m .M .mm .ixx .cppm .h .hh .h++ .hm .hpp .hxx .in .txx .f .F .for .f77 .f90 .f95 .f03 .hip .ispc
CMake Error at CMakeLists.txt:63 (add_library): No SOURCES given to target: tensorflowlite_c
```
# Build Shared Library Statically link to MSVC runtime
Create a directory `tflite_build` in the folder containing the `tensorflow` dirtectory.
```bash
mkdir tflite_build
cd tflite_build
```
Then in the created directory, execute this command to generate build scripts.
```
cmake ../tensorflow/lite/c -A x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded
```
After successful generation, `tflite_build\tensorflowlite_c.vcxproj` is there. Open it with text editor, search `m.lib`
```xml
<AdditionalDependencies>tensorflow-lite\Debug\tensorflow-lite.lib;_deps\abseil-cpp-build\absl\flags\Debug\absl_flags.lib;_deps\abseil-cpp-build\absl\flags\Debug\absl_flags_internal.lib;_deps\abseil-cpp-build\absl\flags\Debug\absl_flags_marshalling.lib;_deps\abseil-cpp-build\absl\flags\Debug\absl_flags_reflection.lib;_deps\abseil-cpp-build\absl\flags\Debug\absl_flags_config.lib;_deps\abseil-cpp-build\absl\flags\Debug\absl_flags_program_name.lib;_deps\abseil-cpp-build\absl\flags\Debug\absl_flags_private_handle_accessor.lib;_deps\abseil-cpp-build\absl\flags\Debug\absl_flags_commandlineflag.lib;_deps\abseil-cpp-build\absl\flags\Debug\absl_flags_commandlineflag_internal.lib;_deps\abseil-cpp-build\absl\container\Debug\absl_raw_hash_set.lib;_deps\abseil-cpp-build\absl\container\Debug\absl_hashtablez_sampler.lib;_deps\abseil-cpp-build\absl\hash\Debug\absl_hash.lib;_deps\abseil-cpp-build\absl\hash\Debug\absl_city.lib;_deps\abseil-cpp-build\absl\hash\Debug\absl_low_level_hash.lib;_deps\abseil-cpp-build\absl\status\Debug\absl_status.lib;_deps\abseil-cpp-build\absl\strings\Debug\absl_cord.lib;_deps\abseil-cpp-build\absl\types\Debug\absl_bad_optional_access.lib;_deps\abseil-cpp-build\absl\strings\Debug\absl_cordz_info.lib;_deps\abseil-cpp-build\absl\strings\Debug\absl_cord_internal.lib;_deps\abseil-cpp-build\absl\strings\Debug\absl_cordz_functions.lib;_deps\abseil-cpp-build\absl\profiling\Debug\absl_exponential_biased.lib;_deps\abseil-cpp-build\absl\strings\Debug\absl_cordz_handle.lib;_deps\abseil-cpp-build\absl\strings\Debug\absl_str_format_internal.lib;_deps\abseil-cpp-build\absl\base\Debug\absl_strerror.lib;_deps\abseil-cpp-build\absl\synchronization\Debug\absl_synchronization.lib;_deps\abseil-cpp-build\absl\debugging\Debug\absl_stacktrace.lib;_deps\abseil-cpp-build\absl\debugging\Debug\absl_symbolize.lib;_deps\abseil-cpp-build\absl\debugging\Debug\absl_debugging_internal.lib;_deps\abseil-cpp-build\absl\debugging\Debug\absl_demangle_internal.lib;_deps\abseil-cpp-build\absl\synchronization\Debug\absl_graphcycles_internal.lib;_deps\abseil-cpp-build\absl\base\Debug\absl_malloc_internal.lib;_deps\abseil-cpp-build\absl\time\Debug\absl_time.lib;_deps\abseil-cpp-build\absl\strings\Debug\absl_strings.lib;_deps\abseil-cpp-build\absl\strings\Debug\absl_strings_internal.lib;_deps\abseil-cpp-build\absl\base\Debug\absl_throw_delegate.lib;_deps\abseil-cpp-build\absl\base\Debug\absl_base.lib;_deps\abseil-cpp-build\absl\base\Debug\absl_spinlock_wait.lib;_deps\abseil-cpp-build\absl\numeric\Debug\absl_int128.lib;_deps\abseil-cpp-build\absl\time\Debug\absl_civil_time.lib;_deps\abseil-cpp-build\absl\time\Debug\absl_time_zone.lib;_deps\abseil-cpp-build\absl\types\Debug\absl_bad_variant_access.lib;_deps\abseil-cpp-build\absl\base\Debug\absl_raw_logging_internal.lib;_deps\abseil-cpp-build\absl\base\Debug\absl_log_severity.lib;-ignore:4221;_deps\farmhash-build\Debug\farmhash.lib;_deps\fft2d-build\Debug\fft2d_fftsg2d.lib;_deps\fft2d-build\Debug\fft2d_fftsg.lib;m.lib;_deps\flatbuffers-build\Debug\flatbuffers.lib;_deps\ruy-build\ruy\Debug\ruy_context_get_ctx.lib;_deps\ruy-build\ruy\Debug\ruy_context.lib;_deps\ruy-build\ruy\Debug\ruy_frontend.lib;_deps\ruy-build\ruy\Debug\ruy_kernel_arm.lib;_deps\ruy-build\ruy\Debug\ruy_kernel_avx.lib;_deps\ruy-build\ruy\Debug\ruy_kernel_avx2_fma.lib;_deps\ruy-build\ruy\Debug\ruy_kernel_avx512.lib;_deps\ruy-build\ruy\Debug\ruy_apply_multiplier.lib;_deps\ruy-build\ruy\Debug\ruy_pack_arm.lib;_deps\ruy-build\ruy\Debug\ruy_pack_avx.lib;_deps\ruy-build\ruy\Debug\ruy_pack_avx2_fma.lib;_deps\ruy-build\ruy\Debug\ruy_pack_avx512.lib;_deps\ruy-build\ruy\Debug\ruy_prepare_packed_matrices.lib;_deps\ruy-build\ruy\Debug\ruy_trmul.lib;_deps\ruy-build\ruy\Debug\ruy_ctx.lib;_deps\ruy-build\ruy\Debug\ruy_allocator.lib;_deps\ruy-build\ruy\Debug\ruy_prepacked_cache.lib;_deps\ruy-build\ruy\Debug\ruy_system_aligned_alloc.lib;_deps\ruy-build\ruy\Debug\ruy_have_built_path_for_avx.lib;_deps\ruy-build\ruy\Debug\ruy_have_built_path_for_avx2_fma.lib;_deps\ruy-build\ruy\Debug\ruy_have_built_path_for_avx512.lib;_deps\ruy-build\ruy\Debug\ruy_thread_pool.lib;_deps\ruy-build\ruy\Debug\ruy_blocking_counter.lib;_deps\ruy-build\ruy\Debug\ruy_wait.lib;_deps\ruy-build\ruy\Debug\ruy_denormal.lib;_deps\ruy-build\ruy\Debug\ruy_block_map.lib;_deps\ruy-build\ruy\Debug\ruy_tune.lib;_deps\ruy-build\ruy\Debug\ruy_cpuinfo.lib;_deps\ruy-build\ruy\profiler\Debug\ruy_profiler_instrumentation.lib;_deps\xnnpack-build\Debug\XNNPACK.lib;_deps\cpuinfo-build\Debug\cpuinfo.lib;_deps\clog-build\Debug\clog.lib;pthreadpool\Debug\pthreadpool.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib</AdditionalDependencies>
```
Remove `m.lib;` in `tflite_build\tensorflowlite_c.vcxproj`.
Then compile it.
```bash
cmake --build . -j --config Release
```
It may take a couple of minutes. After that, you can find the binaries in `Release` folder
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment