Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用tensorflow作为存储库构建基于tensorflow的android应用程序_Android_Tensorflow_Bazel - Fatal编程技术网

使用tensorflow作为存储库构建基于tensorflow的android应用程序

使用tensorflow作为存储库构建基于tensorflow的android应用程序,android,tensorflow,bazel,Android,Tensorflow,Bazel,这就像是一个来自中国的后续问题。我想将android示例项目与tensorflow git repo分开,并能够使用tensorflow作为依赖项单独构建它。这是我的文件夹结构 my_project |-- WORKSPACE |-- android | |-- BUILD | `-- ... |-- tensorflow | |-- tensorflow | | | |-- workspace.bzl | | | |-- tensorflow.bzl |

这就像是一个来自中国的后续问题。我想将android示例项目与tensorflow git repo分开,并能够使用tensorflow作为依赖项单独构建它。这是我的文件夹结构

my_project
|-- WORKSPACE
|-- android
|   |-- BUILD
|   `-- ...
|-- tensorflow
|   |-- tensorflow
|   |   |   |-- workspace.bzl
|   |   |   |-- tensorflow.bzl
|   |   |   `-- ...
|   |-- WORKSPACE
|   |-- BUILD
.    `-- ...
其中android应用程序只是一个副本。 根工作区文件包含以下内容:

workspace(name = "my_android_app")

local_repository(
     name = "org_tensorflow",
     path = "tensorflow", # Relative path to the tensorflow workspace
 )

load('//android:workspace.bzl', 'android_workspace')
android_workspace()

 # Specify the minimum required bazel version.
load("@org_tensorflow//tensorflow:tensorflow.bzl", "check_version")
check_version("0.3.1")
android/workspace.bzl看起来像这样

load('@org_tensorflow//tensorflow:workspace.bzl', 'tf_workspace')

def android_workspace():
  tf_workspace()
android/BUILD的内容与之相同,只是我将@org\u tensorflow作为前缀添加到了//tensorflow everywhere,例如

"@org_tensorflow//tensorflow:tensorflow.bzl"
  "@org_tensorflow//tensorflow/contrib/android:android_tensorflow_inference_jni",
"@org_tensorflow//tensorflow/core:android_tensorflow_lib",
当我尝试构建主目标tensorflow_演示时,它给出了这个错误

no such package 'tensorflow': Package crosses into repository @org_tensorflow and referenced by '//android:libtensorflow_demo.so'.
ERROR: Analysis of target '//android:tensorflow_demo' failed; build aborted.
编辑:

多亏了克里斯蒂娜,我能够将Tensorflow Android演示与Tensorflow源代码解耦。您可以使用以下git作为Tensorflow Android项目的模板。
啊,好吧,我知道你在做什么了。谢谢你的详细说明

这里的问题有点微妙:
copts=tf\u copts()
调用@org\u tensorflow中的函数,如下所示:

def tf_copts():
  return (["-DEIGEN_AVOID_STL_ARRAY",
           "-Iexternal/gemmlowp",
           "-Wno-sign-compare",
           "-fno-exceptions"] +
          if_cuda(["-DGOOGLE_CUDA=1"]) +
          if_android_arm(["-mfpu=neon"]) +
          if_x86(["-msse4.1"]) +
          select({
              "//tensorflow:android": [
                  "-std=c++11",
                  "-DTF_LEAN_BINARY",
                  "-O2",
              ],
              "//tensorflow:darwin": [],
              "//tensorflow:windows": [
                "/DLANG_CXX11",
                "/D__VERSION__=\\\"MSVC\\\"",
                "/DPLATFORM_WINDOWS",
                "/DEIGEN_HAS_C99_MATH",
                "/DTENSORFLOW_USE_EIGEN_THREADPOOL",
              ],
              "//tensorflow:ios": ["-std=c++11"],
              "//conditions:default": ["-pthread"]}))
基本上是一个switch语句,在不同的平台上使用不同的标志。但是,由于
load()
s是在
select()
s之前计算的,因此生成文件突然“包含”了对
//tensorflow
的引用

要解决这个问题,最简单的方法是硬编码所需的COPT,或者在本地存储库中重新定义tf_COPT

通常如何追踪不正确的引用

事实上,我对你所犯的错误感到非常困惑,所以这里有一个关于调试这类事情的大脑转储

追踪这种交叉引用的常用方法是1)检查您的构建文件(可能DEP是错误的),或2)打印出Bazel实际“看到”构建文件的方式。例如,如果您想在本例中打印已评估的生成规则,可以执行以下操作:

$ bazel query --output=build //:libtensorflow_demo.so
# /home/kchodorow/gitroot/so41153199/BUILD:18:1
cc_binary(
  name = "libtensorflow_demo.so",
  tags = ["manual", "notap"],
  deps = ["//:demo_proto_lib_cc", "@org_tensorflow//tensorflow/contrib/android:android_tensorflow_inference_jni", "@org_tensorflow//tensorflow/core:android_tensorflow_lib", "@org_tensorflow//tensorflow/contrib/android:jni/version_script.lds"],
  srcs = ["//:jni/box_coder_jni.cc", "//:jni/imageutils_jni.cc", "//:jni/object_tracking/config.h", "//:jni/object_tracking/flow_cache.h", "//:jni/object_tracking/frame_pair.cc", "//:jni/object_tracking/frame_pair.h", "//:jni/object_tracking/geom.h", "//:jni/object_tracking/gl_utils.h", "//:jni/object_tracking/image-inl.h", "//:jni/object_tracking/image.h", "//:jni/object_tracking/image_data.h", "//:jni/object_tracking/image_neon.cc", "//:jni/object_tracking/image_utils.h", "//:jni/object_tracking/integral_image.h", "//:jni/object_tracking/jni_utils.h", "//:jni/object_tracking/keypoint.h", "//:jni/object_tracking/keypoint_detector.cc", "//:jni/object_tracking/keypoint_detector.h", "//:jni/object_tracking/log_streaming.h", "//:jni/object_tracking/object_detector.cc", "//:jni/object_tracking/object_detector.h", "//:jni/object_tracking/object_model.h", "//:jni/object_tracking/object_tracker.cc", "//:jni/object_tracking/object_tracker.h", "//:jni/object_tracking/object_tracker_jni.cc", "//:jni/object_tracking/optical_flow.cc", "//:jni/object_tracking/optical_flow.h", "//:jni/object_tracking/sprite.h", "//:jni/object_tracking/time_log.cc", "//:jni/object_tracking/time_log.h", "//:jni/object_tracking/tracked_object.cc", "//:jni/object_tracking/tracked_object.h", "//:jni/object_tracking/utils.h", "//:jni/object_tracking/utils_neon.cc", "//:jni/rgb2yuv.cc", "//:jni/rgb2yuv.h", "//:jni/yuv2rgb.cc", "//:jni/yuv2rgb.h"],
  linkopts = ["-landroid", "-ljnigraphics", "-llog", "-lm", "-z defs", "-s", "-Wl,--version-script", "@org_tensorflow//tensorflow/contrib/android:jni/version_script.lds"],
  linkstatic = True,
  linkshared = True,
)
然而,在这种情况下,这实际上对你没有帮助,因为它没有显示科普特人


因此,在运行查询之后,我最终对构建规则进行了“二进制搜索”:我注释掉了除SRC之外的所有内容,尝试构建,然后逐渐取消注释部分,直到得到错误。

谢谢!!这就解决了问题。对于试图这样做的人,我在我的android/workspace.bzl中重新定义了copt,并从BUILD调用了copt,您还需要复制根工作区中的android_sdk_存储库和android_ndk_存储库,并修改cc源以更新头路径。