使用 bazel 使用 android ndk 工具链构建 C++ 目标的正确方法是什么
What is a proper way to build C++ target with android ndk toolchain using bazel
我有一个带有 tflite 模型推理的 .cpp 代码。此源代码文件是 bazel 工作区的一部分。我想使用默认桌面编译器和 ndk 的 arm64 自定义工具链构建它,然后 运行 在 PC 和移动设备上构建它并比较结果。如何从 ndk 工具链 (someandroidndkpath/toolchains/arm64/bin/clang) 指定自定义编译器?
我的 BUILD 文件中有一个简单的目标:
cc_binary(
name = "Evaluation",
srcs = ["evaluation.cpp"],
visibility = ["//visibility:public"],
deps = [
"@org_tensorflow//tensorflow/lite:framework",
"@org_tensorflow//tensorflow/lite/kernels:builtin_ops",
],
)
编辑:
感谢@ahumesky,它有效。我想阐明如何配置 android_ndk_repository 规则。
转到 tf repo tensorflow/third_party/android 并将这些文件放入您的项目。
将android sdk 的路径和版本设置为android_configure.bzl。 (这是最简单的方法,但你可以使用 .bazelrc 变量)
示例:
_ANDROID_NDK_HOME = "~/Android/Sdk/ndk/20.1.5948944/"
_ANDROID_SDK_HOME = "~/Android/Sdk/"
_ANDROID_NDK_API_VERSION = "29"
_ANDROID_SDK_API_VERSION = "29"
_ANDROID_BUILD_TOOLS_VERSION = "29.0.2"
- 添加到工作区。
示例:
load("//third_party/android:android_configure.bzl", "android_configure")
android_configure(name = "local_config_android")
load("@local_config_android//:android.bzl", "android_workspace")
android_workspace()
- 使用以下标志构建目标,将其推送到 android 设备和 运行。
首先确保您在 WORKSPACE
文件中设置了 android_ndk_repository
规则(您手动设置,或通过 TensorFlow 的 configure
脚本设置),然后尝试这些bazel 标志:
--crosstool_top=//external:android/crosstool
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain
--cpu=arm64-v8a
使用 Android 交叉工具,--cpu
可以是 arm64-v8a
、armeabi-v7a
、x86
或 x86_64
[=23 之一=]
请注意,只有在构建 cc_binary
时才需要这些标志。如果您正在构建 android_binary
,android_binary
的依赖项中的 cc_library
规则将自动使用 Android crosstool。
我有一个带有 tflite 模型推理的 .cpp 代码。此源代码文件是 bazel 工作区的一部分。我想使用默认桌面编译器和 ndk 的 arm64 自定义工具链构建它,然后 运行 在 PC 和移动设备上构建它并比较结果。如何从 ndk 工具链 (someandroidndkpath/toolchains/arm64/bin/clang) 指定自定义编译器?
我的 BUILD 文件中有一个简单的目标:
cc_binary(
name = "Evaluation",
srcs = ["evaluation.cpp"],
visibility = ["//visibility:public"],
deps = [
"@org_tensorflow//tensorflow/lite:framework",
"@org_tensorflow//tensorflow/lite/kernels:builtin_ops",
],
)
编辑: 感谢@ahumesky,它有效。我想阐明如何配置 android_ndk_repository 规则。
转到 tf repo tensorflow/third_party/android 并将这些文件放入您的项目。
将android sdk 的路径和版本设置为android_configure.bzl。 (这是最简单的方法,但你可以使用 .bazelrc 变量)
示例:
_ANDROID_NDK_HOME = "~/Android/Sdk/ndk/20.1.5948944/"
_ANDROID_SDK_HOME = "~/Android/Sdk/"
_ANDROID_NDK_API_VERSION = "29"
_ANDROID_SDK_API_VERSION = "29"
_ANDROID_BUILD_TOOLS_VERSION = "29.0.2"
- 添加到工作区。
示例:
load("//third_party/android:android_configure.bzl", "android_configure")
android_configure(name = "local_config_android")
load("@local_config_android//:android.bzl", "android_workspace")
android_workspace()
- 使用以下标志构建目标,将其推送到 android 设备和 运行。
首先确保您在 WORKSPACE
文件中设置了 android_ndk_repository
规则(您手动设置,或通过 TensorFlow 的 configure
脚本设置),然后尝试这些bazel 标志:
--crosstool_top=//external:android/crosstool
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain
--cpu=arm64-v8a
使用 Android 交叉工具,--cpu
可以是 arm64-v8a
、armeabi-v7a
、x86
或 x86_64
[=23 之一=]
请注意,只有在构建 cc_binary
时才需要这些标志。如果您正在构建 android_binary
,android_binary
的依赖项中的 cc_library
规则将自动使用 Android crosstool。