2016-10-04 4 views
2

Android 용 바젤로 TensorFlow의 타겟 //tensorflow:libtensorflow_cc.so를 컴파일하려고합니다. 안드로이드로 작업하는 TensorFlow에 대한 javacpp-preset을 얻기 위해서는이 라이브러리가 필요합니다. S_IREAD가, S_IWRITE 찾을 수 없다는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 

그러나 오류가 발생합니다 : 다음 Android Demo build에서 안드로이드 빌드에서 영감을

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 

, 나는 또한 시도

나는 다음과 같은 성명을 시도 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", 
    ], 
) 

Google 검색에서 S_IWRITE 플래그가 사용 중지되어 Android에서 구현 된 적이없는 것으로 나타났습니다. 그러나, 나는이 문제를 해결하는 방법을 모릅니다.

요약하면 다음과 같습니다. Android 용 libtensorflow_cc.so 타겟을 어떻게 구축 할 수 있는지 알고 있습니까? Android 예제의 라이브러리 빌드는 cc_ops가 필요하기 때문에 나에게 충분하지 않습니다.

+0

giflib이 버전의 문제를 해결 한 것 같다 /+/814d1938f091d311c709bc714c2d31032d43d7bc/egif_lib.c#61 /* android-changed : "S_IREAD | S_IWRITE"를 "S_IRUSR | S_IWUSR"로 변경 */ –

+0

나는 Dan 앨버트 (Albert)의 대답은 원래의 문제를 해결했지만 다음 문제로 이어졌습니다. – andy

+0

아마도 그 문제는 서로 관련이 없으며 완전히 다른 대답을 가질 것이므로 새로운 질문을해야 할 것입니다. 파트 2는 NDK와 관련이있는 것보다 TF와 관련이있는 것으로 보입니다. –

답변

2

Google 검색에서 S_IWRITE 플래그가 사용되지 않으므로 Android에서 구현되지 않았 음을 알았습니다. 우리는 호환성을 위해 그것에 우리의 마음을 변경 한 같은

같습니다 : 시스템의 SYS/stat.h의 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 

; 아직 NDK에서 배송되지 않았습니다. 불행히도 대부분의 NDK 헤더는 매우 오래되었습니다. 이것은 https://github.com/android-ndk/ndk/issues/120입니다.

NDK r14에 대한 픽스가 제공됩니다. (# 120은 그때까지 고정되지 않으므로 이전 헤더를 수정하기 위해 방금 https://github.com/android-ndk/ndk/issues/211을 제출했습니다).

그때까지는 해당 정의를 cflags에 추가 할 수 있습니다. bazel이가 할 수있는 방법처럼 보이는이 될 것입니다 : https://android.googlesource.com/platform/external/giflib :

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

관련 문제