2

現在、TensorFlow のターゲット //tensorflow:libtensorflow_cc.so を Android 用の bazel でコンパイルしようとしています。Android で動作する TensorFlow の javacpp-presets を取得するには、このライブラリが必要です。

次のステートメントを試しました。

bazel build -c opt //tensorflow:libtensorflow_cc.so --crosstool_top=//external:android/crosstool --cpu=armeabi-v7a --host_crosstool_top=@bazel_tools//tools/cpp:toolchain --verbose_failures

ただし、S_IREAD、S_IWRITE が見つからないというエラーが発生します。

external/gif_archive/giflib-5.1.4/lib/egif_lib.c:62:6: error: 'S_IREAD' undeclared (first use in this function)
  S_IREAD | S_IWRITE);
  ^
external/gif_archive/giflib-5.1.4/lib/egif_lib.c:62:6: note: each undeclared identifier is reported only once for each function it appears in
external/gif_archive/giflib-5.1.4/lib/egif_lib.c:62:16: error: 'S_IWRITE' undeclared (first use in this function)
      S_IREAD | S_IWRITE);
                ^
Target //tensorflow:libtensorflow_cc.so failed to build

Android Demo buildの Android build に触発されて、cc_binary 定義を次のコードに変更しようとしましたが、それでも同じエラーが発生しました。

cc_binary(
    name = "libtensorflow_cc.so",
    copts = tf_copts(),
    linkopts = [
        "-landroid",
        "-ljnigraphics",
        "-llog",
        "-lm",
        "-z defs",
        "-s",
        "-Wl,--icf=all",  # Identical Code Folding
    ],
    linkshared = 1,
    linkstatic = 1,
    deps = [
        "//tensorflow/c:c_api",
        "//tensorflow/cc:cc_ops",
        "//tensorflow/core:tensorflow",
    ],
)

グーグルで調べたところ、S_IWRITE フラグが廃止されたため、Android に実装されていないことがわかりました。ただし、この問題を回避する方法がわかりません。

要約すると、Android 用の libtensorflow_cc.so ターゲットをビルドする方法を知っていますか? cc_ops も含める必要があるため、Android サンプルのライブラリ ビルドだけでは十分ではありません。

4

1 に答える 1