Last active
October 8, 2022 09:25
-
-
Save wangjia184/27d02d50906641b7463b67107e1622ba to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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