我目前正在尝试使用bazel为Android编译TensorFlow的目标//tensorflow:libtensorflow_cc.so。我需要这个库才能获得适用于Android的TensorFlow的javacpp-presets。Tensorflow:如何为Android编译libtensorflow_cc.so
我尝试了以下声明:
bazel build -c opt //tensorflow:libtensorflow_cc.so --crosstool_top=//external:android/crosstool --cpu=armeabi-v7a [email protected]_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编译启发,我也尝试过将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目标吗? Android示例中构建的库对我来说还不够,因为我还需要包含cc_ops。
这giflib的版本似乎已经解决了这一问题: https://android.googlesource.com/platform/external/giflib /+/814d1938f091d311c709bc714c2d31032d43d7bc/egif_lib.c#61 注意的评论,他们已经进行了更改:/ * Android的改变:改变“S_IREAD | S_IWRITE”到“S_IRUSR | S_IWUSR” */ –
我更新的问题,丹艾伯特的答案解决了原来的问题,但是却导致了下一个问题。 – andy
应该问一个新的问题,因为这个问题是不相关的,会有一个完全不同的答案。第二部分看起来只是TF相关而不是NDK相关的。 –