2016-10-04 149 views
2

我目前正在尝试使用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。

+0

这giflib的版本似乎已经解决了这一问题: https://android.googlesource.com/platform/external/giflib /+/814d1938f091d311c709bc714c2d31032d43d7bc/egif_lib.c#61 注意的评论,他们已经进行了更改:/ * Android的改变:改变“S_IREAD | S_IWRITE”到“S_IRUSR | S_IWUSR” */ –

+0

我更新的问题,丹艾伯特的答案解决了原来的问题,但是却导致了下一个问题。 – andy

+0

应该问一个新的问题,因为这个问题是不相关的,会有一个完全不同的答案。第二部分看起来只是TF相关而不是NDK相关的。 –

回答

2

从谷歌搜索,我发现S_IWRITE标志已被弃用,因此从未在Android中实现。

看起来我们已经改变了我们的头脑对兼容性的缘故:https://android.googlesource.com/platform/bionic/+/1f1a51aecd7c825418bfedcb66772e92de790149%5E%21/#F2

#if defined(__USE_BSD) || defined(__USE_GNU) 
#define S_IREAD S_IRUSR 
#define S_IWRITE S_IWUSR 
#define S_IEXEC S_IXUSR 
#endif 

这是系统的SYS/stat.h;它尚未在NDK中发货。不幸的是,大多数NDK头文件已经过时了。这是https://github.com/android-ndk/ndk/issues/120

我们将在NDK r14中解决这个问题(我刚刚提交了https://github.com/android-ndk/ndk/issues/211来修复旧的头文件,以防120号文件在那时没有修复)。

在此之前,您可以将这些定义添加到您的cflags中。貌似做方式这巴泽勒是:

cc_binary(
    name = "libtensorflow_cc.so", 
    defines = [ 
     "S_IREAD=S_IRUSR", 
     "S_IWRITE=S_IWUSR", 
     "S_IEXEC=S_IXUSR", 
    ], 
    ... 
) 

https://www.bazel.io/versions/master/docs/be/c-cpp.html#cc_binary.defines

+0

谢谢!这解决了这个问题。但是,现在我有下一个问题。你知道如何解决这个问题吗? – andy